我有那个rspec测试
let(:document) { Document.new }
let(:residue) { Residue.new }
describe "inner_residue=" do
before do
document.producer_residue = residue
end
it 'dont changes the producer residue' do
expect { document.inner_residue = residue }.to_not change(document, :producer_residue)
end
end
输出此错误:
producer_residue should not have changed, but did change from #<Residue id: nil, un_code: nil, description: "res", created_at: ... > to #<Residue id: nil, un_code: nil, description: "res", created_at: ... >
如你所见,有相同的残留物。 这个方法比较复杂,但这个方法也很简单:
def inner_residue=(other)
return self.producer_residue = self.addressee_residue = nil unless other
self.producer_residue = producer_residue
end
所以... WTF?
更改自身的残留会使断言失败?我已经检查过它们是否与==,===,eq相同?一贯如此。我无法理解这有什么不妥。
我正在使用rspec 1.3(它是一个rails 2.3应用程序,我无法升级到rspec2)
答案 0 :(得分:2)
RSpec对于相同的对象没有问题。这里的问题是,在ActiveRecord中,两个未保存的模型被认为是不相等的,即使它们具有所有相同的属性。如果您运行puts (Residue.new == Residue.new)
,则可以看到此内容。
您必须保存Residue对象才能工作。