我在名为Project的模型中有这个代码。它在项目保存之前将所有者设置为项目。
before_save :set_owner
# Set the owner of the project right before it is saved.
def set_owner
self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model.
# Lifecycle is set by the form's collection_select
end
在我的Rspec测试中,current_user函数被删除以返回一个mock_model(这就是为什么上面的代码显示的是mock_model而不是current_user)。
现在,当我运行这个时,我的Rspec测试会中断并抱怨:
undefined method `mock_model' for #<Project:0x105c70af0>
我的猜测是,因为before_save是一个实例函数,它以某种方式认为mock_model是Project中定义的函数。
有人必须在此之前遇到过这种情况......有什么方法吗?
答案 0 :(得分:2)
立即突出两件事:
您不应该在实际的Project模型中使用mock_model。所有测试代码都应保留在规范中。
您无法将current_user对象从控制器传递给模型(至少不应该以任何方式)。
我会在项目模型中使用attr_accessor来设置current_user id。
class Project < AR::Base
attr_accessor :current_user
def set_owner
self.owner_id = current_user.id unless current_user.nil?
end
end
那么你的规范应该看起来更像是:
it "should set the owner id" do
user = mock_model(User)
project = Project.new
project.current_user = user
project.save
project.owner_id.should == user.id
end