2008-09-12 12 views
12

次のようなコントローラーメソッドがあるとします。XMLメソッドのRails統合テストを設定するには?

def show 
    @model = Model.find(params[:id]) 

    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => model } 
    end 
end 

戻り値に期待されるXMLがあることを主張する統合テストを作成する最良の方法は何ですか?

答えて

11

統合テストでフォーマットしてassert_selectを使用しての組み合わせは素晴らしい作品:詳細については

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

は、Railsのドキュメントで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

も非常に脆弱であるassert_equal A..Z統合テスト –

+1

を探して、私が知っているパート。要素や属性の順序は保証されません。変更された場合、テストは中断されます。リテラル文字列の比較は、XMLツリーの等価性をチェックする正しい方法ではありません。 – bjnord

5

を期待していたものに等しい主張することができます:リクエスト・オブジェクトは、ヘッダーを受け入れる設定し

+0

これは私がすでに持っている機能テストです。統合テストを探しています。 –

1

これらの2つの回答は素晴らしいものですが、ほとんどの状況で異なるようになるため、assert_equalに失敗するdatetimeフィールドが含まれています。 XMLパーサーを使用してインクルード@response.bodyを処理し、個々のフィールド、要素の数などを比較する必要があるようです。それとも簡単な方法がありますか?

+0

はい。日付と時刻フィールドは、assert_equalがXMLツリーを比較する間違った方法であるもう一つの理由です。自分のために、私はテストで平等のためにオブジェクト全体を比較しませんでした。私はassert_select(ntalbottが上に示したように)をチェックしたい特定の属性に使用しました。 – bjnord

5

ntalbottからの回答は、getアクションを示しています。ポストアクションはややこしいです。新しいオブジェクトをXMLメッセージとして送信し、XML属性をコントローラのparamsハッシュに表示するには、ヘッダーを正しく取得する必要があります。ここにある例(Rails 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 

投稿の第2引数はパラメータハッシュである必要はありません。ヘッダーが正しい場合は、文字列(XMLを含む)、にすることができます。 3番目の引数@headersは、私に把握するために多くの研究を要した部分です。

(また注意to_sの使用assert_selectの整数値を比較する。)

関連する問題