Ruby on rails Rspec模拟_模型在实例化对象中不可用?
我在一个名为Project的模型中有这段代码。它在保存项目之前为项目设置所有者Ruby on rails Rspec模拟_模型在实例化对象中不可用?,ruby-on-rails,rspec,Ruby On Rails,Rspec,我在一个名为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 th
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测试中,当前的_用户函数被删除,以返回一个mock_模型(这就是为什么上面的代码显示的是mock_模型而不是当前的_用户)
现在,当我运行此程序时,我的Rspec测试中断,并抱怨:
undefined method `mock_model' for #<Project:0x105c70af0>
未定义的方法“mock_model”#
我的猜测是,因为在_save是一个实例函数之前,它不知何故认为mock_模型是一个在Project中定义的函数
一定有人以前遇到过这个。。。有什么办法可以解决吗?两件事马上就突出了:
class Project < AR::Base
attr_accessor :current_user
def set_owner
self.owner_id = current_user.id unless current_user.nil?
end
end
除我的注释外:控制器中的my helper方法不能用于模型中的my before_save函数?即使我调用current_user,它也会给我一个错误,即未定义的局部变量或函数current_user在。模型的范围不包括我的应用程序控制器中的helper方法,嗯?我在实际的项目模型中没有使用mock_模型。我只是在那里写的,以避免混淆(基本上,这就是我的测试用它来替换实际代码的地方)。不过,attr_访问器不允许我使用helper方法。我的问题是,我如何获得实际的当前用户?我有点困惑,你想从哪里获得当前用户?您最初的问题似乎是问为什么在项目模型中有一个未定义的方法mock_模型。对不起,我的问题不清楚。当前用户是在我的应用程序控制器中定义的助手函数。所以实际上有两个问题。第一个是mock_模型不能从我的before_save回调中访问。第二个问题是当前用户无法从我的模型内部访问。在我的测试中,当前的_用户在调用mock_模型时被剔除,这一事实将两者联系在一起。因此,如果我让mock_模型在测试中工作,那么当前的_用户将无法在实现中工作。这更有意义吗?您不能在测试的类内部使用mock_模型。这是一个根本性的错误——换句话说,你做错了<代码>当前用户在您的模型中不可用,因为模型-视图-控制器模式的关注点分离。Beerlington的回答允许您从控制器(或从规范,如图所示)传入
current\u user
的值,以便正确设置项目。这是完成你想做的事情的唯一可行的方法。所以试试看,我想你会发现它是有效的:)
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