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指的是 class 的对象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 回答