0

テストの書き方を学んでいるので、書いた小さなメソッド用に書いています。このメソッド を呼び出したいのですが、オブジェクトupdate_user_region_idの変更を予期しているはずです。user

def update_user_region_id(user_id, region_id)
  user = User.where(id: user_id).first
  region = Region.where(id: region_id).first
  return if user.nil?
  user.region_id = region_id
  user.region = region.name
  user.save!
end

update_user_region_id別のメソッドから呼び出されたメソッドです (これが関連しているかどうかはわかりません)。

私のテストのために、私は書いた:

it 'should update user region id' do
  user = Factory :user
  city = Factory :city
  expect{
    update_user_region_id(user.id, city.id)
  }.to change(user, :region_id)
end

次のエラーが発生し続けます。

undefined method `update_user_region_id' for #<RSpec::Core::ExampleGroup::Nested_1:0x007f9e0a57f490>

1. これは良いテストですか?

2. このテストを修正するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

1

問題は、それを呼び出すコンテキストではself、クラスのオブジェクトを参照しRSpec::Core::ExampleGroup::Nested_1、明示的な受信者を提供しないためself、メッセージを受信するのはそのオブジェクトであることです。

@pjam が指摘しているように、これ以上の情報がなければ、テストを修正する方法を正確に説明することは不可能です。しかし、一般的なポイントは、update_user_region_idメッセージには適切な受信者が必要だということです。たとえば、それがクラスのクラス メソッドである場合、 をFoo呼び出すことができますFoo.update_user_region_id。または、インスタンス メソッドの場合は、最初にオブジェクトをインスタンス化する必要がある場合があります (例: Foo.new.update_user_region_id)。

于 2013-03-13T20:16:15.937 に答える