2008-09-12 3 views

답변

11

통합 테스트의 형식과 assert_select을 사용의 조합은 잘 작동 : 자세한 내용은

class ProductsTest < ActionController::IntegrationTest 
    def test_contents_of_xml 
    get '/index/1.xml' 
    assert_select 'product name', /widget/ 
    end 
end 

은 레일 문서에 assert_select을 확인하십시오.

0

설정 요청 객체는 헤더 동의 컨트롤러.

class ProductsControllerTest < ActionController::TestCase 
    def test_should_get_index_formatted_for_xml 
    @request.env['HTTP_ACCEPT'] = 'application/xml' 
    get :index 
    assert_response :success 
    end 
end 
+0

내가 아는 그 부분하는 A..Z 통합 테스트 –

+1

그 assert_equal을 찾는 것은 매우 취약하다. 엘리먼트 또는 애트리뷰트 순서의 보장은 없습니다. 변경되면 테스트가 중단됩니다. 리터럴 문자열 비교는 XML 트리의 평등을 검사하는 올바른 방법이 아닙니다. – bjnord

5

을 기대하고 있었던 것 같다 :

+0

그것은 이미 가지고있는 기능 테스트입니다. 통합 테스트를 찾고 있습니다. –

1

이 두 가지 대답은 훌륭한 결과를 낳습니다. 단, 대부분의 상황에서 다를 수있는 날짜 시간 필드가 내 결과에 포함되므로 assert_equal이 실패합니다. XML 구문 분석기를 사용하여 includes @response.body을 처리 한 다음 개별 필드, 요소 수 등을 비교해야합니다. 아니면 더 쉬운 방법이 있습니까?

+0

예; 날짜와 시간 필드가 assert_equal이 XML 트리를 비교하는 잘못된 방법 인 또 다른 이유입니다. 나 자신을 위해, 나는 나의 시험에서 평등을위한 전체 대상을 비교하지 않았다; 내가 확인하고자하는 특정 속성에 대해 assert_select (위에 표시된 ntalbott)를 사용했습니다. – bjnord

5

ntalbott의 답변에 따라 조치가 표시됩니다. 포스트 작업은 조금 까다 롭습니다. 새 객체를 XML 메시지로 보내고 컨트롤러의 params 해시에 XML 속성을 표시하려면 헤더를 올바르게 가져와야합니다. 다음은 레일스 2.3.x의 예제입니다.

class TruckTest < ActionController::IntegrationTest 
    def test_new_truck 
    paint_color = 'blue' 
    fuzzy_dice_count = 2 
    truck = Truck.new({:paint_color => paint_color, :fuzzy_dice_count => fuzzy_dice_count}) 
    @headers ||= {} 
    @headers['HTTP_ACCEPT'] = @headers['CONTENT_TYPE'] = 'application/xml' 
    post '/trucks.xml', truck.to_xml, @headers 
    #puts @response.body 
    assert_select 'truck>paint_color', paint_color 
    assert_select 'truck>fuzzy_dice_count', fuzzy_dice_count.to_s 
    end 
end 

게시 할 두 번째 인수는 매개 변수 해시 일 필요는 없습니다. 헤더가 맞으면 문자열 (XML 포함) 이 될 수 있습니다. 세 번째 주장 인 @headers는 나에게 많은 연구를 요구하는 부분입니다.

(또한 주 그리고 to_s의 사용 assert_select의 정수 값을 비교.)