- 更新日: 2014年3月14日
- RSpec
RSpecでAjaxリクエストに対しRequest Spec(結合テスト)を行う
Request Spec で Ajax リクエストに対するテストを行う方法です。ちょっとはまりました。Controller Spec(spec/controllers)での Ajax リクエストに対するテストの情報はたくさん見つかりましたが、Controller Spec(コントローラーテスト)での Devise ユーザーのログインが上手くできず挫折..。
— 環境 —
rails-4.0.1
devise-3.2.2
rspec-rails-2.14.0
capybara-2.2.0
Controller Spec の場合 xhr メソッドの第二引数はアクション名を書きますが、Request Spec(結合テスト)の場合 xhr メソッドの第二引数には HTTP メソッド名(post や delete)に対応するパスを指定します。
Request Spec で Ajax リクエストをテストするコード
spec/requests/comment_pages_spec.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
describe "Comment pages" do let(:user) { FactoryGirl.create(:user) } before { login user } subject { page } describe "Ajax request on CommentsController" do describe "creating a comment with Ajax" do it "should increment the Comment count" do expect do xhr :post, comments_path, comment: { message: "hello" } end.to change(Comment, :count).by(1) end it "should respond with success" do xhr :post, comments_path, comment: { message: "hello" } response.code.should == "200" end end describe "destroying a comment with Ajax" do before { FactoryGirl.create(:comment, user: user) } let(:comment) { user.comments.first } it "should decrement the Comment count" do expect do xhr :delete, comment_path(comment.id), id: comment.id end.to change(Comment, :count).by(-1) end it "should respond with success" do xhr :delete, comment_path(comment.id), id: comment.id response.code.should == "200" end end end end |
Ajax の場合、expect(response).to be_success より、response.code.should == “200” のほうが、テスト失敗時にHTTPステータスコードが把握できるので分かりやすい。また、post, delete のリクエストで、Comment テーブルのレコード数が増減しているかをチェックしています。
FactoryGirl と login メソッドについて
省略していますが、FactoryGirl で User, Comment モデルのオブジェクトを生成させるファイルは以下のような感じ。
spec/factories.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 |
FactoryGirl.define do factory :user do sequence(:name) { |n| "Person #{n}" } sequence(:email) { |n| "person_#{n}@example.com"} password "hogefuga" password_confirmation "hogefuga" end factory :comment do message "good morning" user end end |
Devise 使用時に、Request Spec でユーザーをログインさせる login メソッドについては以下を参照。
Rails + RSpec + Capybara で Devise での認証ログインが必要なインテグレーションテスト(RequestSpec)を行う | EasyRamble
- – 参考リンク –
- ruby on rails – How do I test ajax POST request with RSpec? – Stack Overflow
- How do I resolve “bad argument (expected URI object or URI string)”? Ruby on Rails, Michael Hartl Tutorial – Stack Overflow
- ajax – I’m learning Rails with M. Hartl’s Tutorial. Ch. 11.2.5 and got this error in tests: ArgumentError: bad argument (expected URI object or URI string) – Stack Overflow
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
Leave Your Message!