我正在使用RSpec测试我的RoR应用程序,并在内部使用ActiveLDAP。我现在正在为一个通过ActiveLDAP创建新对象的控制器编写规范,所以我写了几行来模仿创建记录的行为:
before(:each) do
@sample_attributes = {"a" => "b", "c" => "d"}
@cu = Cloud::User.new
@cu.stub(:save).and_return false
@cu.stub(:attributes=).with(@sample_attributes).and_return @sample_attributes
Cloud::User.stub(:new).and_return @cu
end
这样做的目的是允许对@cu模型提出期望,以确保它将针对它运行某些命令。像这样:
it "should save the new cloud user" do
@cu.should_receive(:save).and_return false
post 'create', :cloud_user => @sample_attributes
end
it "should set the attributes of the new cloud user" do
@cu.should_receive(:attributes=).with(@sample_attributes).and_return @sample_attributes
post 'create', :cloud_user => @sample_attributes
end
非常简单,对吧?那么这就是问题所在。第一个成功,但第二个总是抛出这个错误:
private method `new' called for #<Class:0x007f8bcad775c8>
当它在控制器中运行此行时:
@cloud_user = Cloud::User.new
不,那不是私人方法。并且EXACT SAME LINE在第一次测试中工作正常。此外,它不是个人测试的固有内容。如果我颠倒了两个测试的顺序,则设置属性测试成功,保存用户测试失败。基本上,无论哪一个先运行,它都会成功,无论哪个运行第二个都会失败。
为什么?
有没有人有任何想法?我不得不认为它与stub命令如何与ActiveLDAP一起工作有关,但我不知道。看起来很简单!