質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

1回答

4112閲覧

rspec のインスタンス変数が更新されるタイミングを教えてください。

bouyomisan

総合スコア87

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

0クリップ

投稿2017/05/12 06:00

Rspec のコントローラーのテストの写経をしています。 before で@contact というインスタンス変数をつくってテストをかいているのですが、参考書を見ているといつの間にかその変数が更新されていました。

① it "locates the requested @contact" とい exampleでは
assigns(:contact) と @contact が等しいことを確かめていますが、@contact の値ははFctoryGirl の値に変えられてしまったということで正しいですか?

② "changes @contact's attributes" という example ではなぜリロードしているのですか?リロードしなきゃ値が変わらないなら、一つ目の example では値が変わってないことになるのでとても奇妙に思えます。

よろしくお願いします。

ruby

1#spec/controllers/contacts_controller_spec.rb 2 3describe 'PATCH #update' do 4 before :each do 5 @contact = create(:contact, 6 firstname: 'Lawrence', 7 lastname: 'Smith') 8 end 9 10 # 有効な属性の場合 11 context "valid attributes" do 12 13 14 # 要求された@contact を取得すること 15 it "locates the requested @contact" do 16 patch :update, id: @contact, contact: attributes_for(:contact) 17 expect(assigns(:contact)).to eq(@contact) 18 end 19 20 21 # @contact の属性を変更すること 22 it "changes @contact's attributes" do 23 patch :update, id: @contact, 24 contact: attributes_for(:contact, 25 firstname: 'Larry', 26 lastname: 'Smith') 27 @contact.reload 28 expect(@contact.firstname).to eq('Larry') 29 expect(@contact.lastname).to eq('Smith') 30 end 31end 32

ruby

1#faactorygirl のデータ 2FactoryGirl.define do 3 factory :contact do 4 firstname "Tetsuya" 5 lastname "Mori" 6 sequence(:email) {Faker::Internet.email} 7 8 after(:build) do |contact| 9 [:home_phone, :work_phone, :mobile_phone].each do |phone| 10 contact.phones << FactoryGirl.build(:phone, phone_type: phone, contact: contact) 11 end 12 end 13 factory :invalid_contact do 14 firstname nil 15 end 16 end 17end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

suama

2017/05/17 04:51

良かったらControllerのソースも添えていただけますか?
guest

回答1

0

① :正しいかどうか微妙です。
みんな :contact なのでややこしいですが
attributes_for(:contact):これは Factoryのです
expect(assigns(:contact)).to  これはcontrollerの中で定義された @contactです。
eq(@contact) これは beforeで定義されたcontactです
つまりひとつ目の it は controller のインスタンス変数の値の確認です。

2つめの it は実際にDBの更新がされたかどうか確認するためにreloadしています。cntrollerでは値が変更されてたけどDBへの書き込みでおかしくなったということもありますから

###
①が微妙と言ったのは、
patchは「FctoryGirl の値に変える」様にしています。
しかし expectは controllerの@contactがbeforeの@contactと同じだ、つまりFactoryの値と異なるとしています。
はて、、、
ということでcontrollerのcode見ないとわからない点があります。

投稿2019/09/16 12:46

winterboum

総合スコア23331

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問