Rspec 1.3中的更改匹配器无法识别相等的对象

时间:2012-05-22 14:47:21

标签: ruby-on-rails ruby rspec comparison matcher

我有那个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)

1 个答案:

答案 0 :(得分:2)

RSpec对于相同的对象没有问题。这里的问题是,在ActiveRecord中,两个未保存的模型被认为是不相等的,即使它们具有所有相同的属性。如果您运行puts (Residue.new == Residue.new),则可以看到此内容。

您必须保存Residue对象才能工作。