everyday Rails RspecによるRailsテスト入門という参考書のコントローラのテストについて、下記のような例題がありました。
- Pathリクエストをテストする
spec/controllers/contacts_controller_spec.rb
describe ContactsController do ~略~ describe 'PATCH #update' do before :each do @contact = create(:contact, firstname: 'Lawrence', lastname: 'Smith') end context "valid attributes" do example '要求された@contactを取得すること' do patch :update, id: @contact, contact: attributes_for(:contact) expect(assigns(:contact)).to eq(@contact) end ~略~
テストを実行すると、テストは通るのですが、なぜ上記のテストでテストがパスするのかがわかりませんでした。(assigns(:contact)
の値と、@contact
の値が一致していない気がします。)
ちなみにFactoryとControllerの内容は下記のとおりです。
spec/factories/contacts.rb
FactoryGirl.define do factory :contact do firstname { Faker::Name.first_name } lastname { Faker::Name.last_name } email { Faker::Internet.email } end end
app/controllers/contacts_controller.rb
class ContactsController < ApplicationController #before_action :authenticate, except: [:index, :show] before_action :set_contact, only: [:show, :edit, :update, :destroy] ~略~ # PATCH/PUT /contacts/1 # PATCH/PUT /contacts/1.json def update respond_to do |format| if @contact.update(contact_params) format.html { redirect_to @contact, notice: 'Contact was successfully updated.' } format.json { render :show, status: :ok, location: @contact } else format.html { render :edit } format.json { render json: @contact.errors, status: :unprocessable_entity } end end end ~略~
テスト内の各変数のプリントデバッグを試みると、下記のようになります。
spec/controllers/contacts_controller_spec.rb
describe ContactsController do ~略~ describe 'PATCH #update' do before :each do @contact = create(:contact, firstname: 'Lawrence', lastname: 'Smith') end context '有効な属性の場合' do example '要求された@contactを取得すること' do debug_attributes_for = attributes_for(:contact) patch :update, id: @contact, contact: debug_attributes_for expect(assigns(:contact)).to eq(@contact) ### puts("debug_attributes_forデバッグ") p debug_attributes_for puts("@contactデバッグ") p @contact puts("assigns(:contact)デバッグ") p assigns(:contact) ### end ~略~
テスト実行結果
~略~ PATCH#update 有効な属性の場合 debug_attributes_forデバッグ {:firstname=>"Ardith", :lastname=>"Effertz", :email=>"lesly.carter@mcdermott.org"} @contactデバッグ #<Contact id: 1, firstname: "Lawrence", lastname: "Smith", email: "westley@dickinson.org", created_at: "2015-12-14 04:06:43", updated_at: "2015-12-14 04:06:43"> assigns(:contact)デバッグ #<Contact id: 1, firstname: "Ardith", lastname: "Effertz", email: "lesly.carter@mcdermott.org", created_at: "2015-12-14 04:06:43", updated_at: "2015-12-14 04:06:43"> ~略~ Finished in 0.4773 seconds (files took 1.86 seconds to load) 20 examples, 0 failures, 4 pending
プリントデバッグした結果を見てもassigns(:contact)
と@contact
が一致していませんが、テストは通っていて、なぜテストが通るのかが理解できないでいます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/21 13:15