- 更新日: 2015年8月26日
- RSpec
複数モデルのpost :createをテストするRSpecコード(Controller Spec)
先日のエントリー、Railsのfields_forで異なるモデルを編集するフォームを作成 | EasyRamble で書いたようなケースの場合、複数モデルのオブジェクトを fields_for を使って1つのフォームから送信して、コントローラーの create メソッドで複数のオブジェクトを DB のレコードに保存する場合がある。
それで、RSpec のテストコードで Controller Spec を書こうとして、1つの post に複数のオブジェクト用のパラメータを渡す方法が最初分からなくて困りました。通常のオブジェクト1つを post する場合の ControllerSpec については以下を参照。
RSpec の ControllerSpec でパラメータとともに post 送信するテスト | EasyRamble
— 環境 —
rspec-rails 3.1.0
post :create にパラメータを複数指定すればOK
結論から言いますと、Controller Spec で普通に post :create のオプションとして、複数モデル用のパラメータを複数指定してやれば OK でした。サンプルのテストコードは以下のような感じで、first_model_params, second_model_params の2つを post メソッドのオプションとして渡す。ユーザーがログイン時は、モデルのレコードが1つ増えることを確認しています。
spec/controllers/some_controller_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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
require 'rails_helper' describe SomeController do # for first_model let!(:first_model_params) do { first_title: "title for first model", first_comment: "comment for first model" } end # for second_model params let!(:second_model_params) do { second_title: "title for second model", second_comment: "comment for second model" } end describe "when user does not login" do describe "creating objects of first and second models" do it "should not increment the first model count" do expect do post :create, first_model: first_model_params, second_model: second_model_params, end.to change(FirstModel, :count).by(0) end it "should not increment the second model count" do expect do post :create, first_model: first_model_params, second_model: second_model_params, end.to change(SecondModel, :count).by(0) end end end describe "when user login" do login_user describe "creating objects of first and second models" do it "should increment the first model count" do expect do post :create, first_model: first_model_params, second_model: second_model_params, end.to change(FirstModel, :count).by(1) end end describe "creating objects of first and second models" do it "should increment the second model count" do expect do post :create, first_model: first_model_params, second_model: second_model_params, end.to change(SecondModel, :count).by(1) end end end end |
上記のようなテストコードで、複数モデル用のパラメータを post する Controller Spec を動作させることができました。Controller Spec でユーザーをログインさせる方法については、以下エントリーを参照。
Rspec で Controller テストの準備編 | EasyRamble
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
- Serverspec で複数のホストで共通のテストを使い回す
Leave Your Message!