2011-09-03 6 views
15

私はちょっと怪しいです。私は、次の統合テストを持っている:RspecとRack :: TestによるREST-API応答のテスト

require "spec_helper" 

describe "/foods", :type => :api do 
    include Rack::Test::Methods 

    let(:current_user) { create_user! } 
    let(:host) { "http://www.example.com" } 

    before do 
    login(current_user) 
    @food = FactoryGirl.create_list(:food, 10, :user => current_user) 
    end 

    context "viewing all foods owned by user" do 

    it "as JSON" do 
     get "/foods", :format => :json 

     foods_json = current_user.foods.to_json 
     last_response.body.should eql(foods_json) 
     last_response.status.should eql(200) 

     foods = JSON.parse(response.body) 

     foods.any? do |f| 
     f["food"]["user_id"] == current_user.id 
     end.should be_true 

     foods.any? do |f| 
     f["food"]["user_id"] != current_user.id 
     end.should be_false 
    end 

    end 

    context "creating a food item" do 

    it "returns successful JSON" do 
     food_item = FactoryGirl.create(:food, :user => current_user) 

     post "/foods.json", :food => food_item 

     food = current_user.foods.find_by_id(food_item["id"]) 
     route = "#{host}/foods/#{food.id}" 

     last_response.status.should eql(201) 
     last_response.headers["Location"].should eql(route) 
     last_response.body.should eql(food.to_json) 
    end 

    end 

end 

私は私にlast_response方法を取得するために::メソッドを、必要なラック::テストを追加しましたが、正しく動作していないようです。 last_responseはいつも私が既に署名したにも関わらず、ページsign_in私を見るようだ。

私はlast_responseが離れて行くと、私が代わりにresponseを使用することができますし、私は現在の応答を取得ラック::テスト::メソッドを削除した場合。すべてがうまくいくようです。

これはなぜですか? responseメソッドはどこから来ますか?セッションから前の応答を取得するのにresponseを使用できますか?

私はルートを照合できるように

last_response.headers["Location"].should eql(route) 

ため、last_response、または類似のものを使用する必要があります。それがなければ、私は設定されるだろう。

+1

'login'のコードは何ですか?それはrspecで定義されたメソッドですか、それとも他のどこかで定義しましたか?ログインページにリダイレクトが必要ですか?もしそうなら、ログインコードのあとに 'follow_redirect!'を書いてください。 – iain

+0

あなたが思いついた解決策は何ですか?私は[Ticketee](https://github.com/rails3book/ticketee)の例でも動作しますが、まだ 'last_response'には私が期待する応答が含まれていませんか?また、答えの1つをマークすることを忘れないでください。 – JJD

答えて

1

responseは特定のスペックタイプに対して自動的です。

Rspecはおそらくを:type => :apiブロックに混合します。
responseは、:type => :controllerブロックの場合と同様に、ActionController::TestCase::Behaviorから来るでしょう。

responseで指定される前に応答を取得する場合は、次の要求を行う前に変数に格納してみてください。

https://www.relishapp.com/rspec/rspec-rails/v/2-3/docs/controller-specsおよびhttps://github.com/rspec/rspec-railsには、さまざまなスペックタイプのいくつかが混在しているかについての情報があります。

+1

API仕様を別のフォルダに移動したときに仕様/コントローラに入れたときに仕様が機能しないという同じ問題がありましたが、このエラーは発生しませんでした – shicholas

0

login(current_user)はRack :: Test :: Methodsでは動作しないと思います。おそらく認証トークンを使用して、API呼び出しを通じて認証する方法が必要です。

responseは、あなたのログインについて知っているActionControllerに関連付けられています。私が間違っていないと、API呼び出しはコントローラとは独立しているので、既にログインしていることはわかりません。

の例のアプリTicketeeを参照してください。

関連する問題