2012-05-22 49 views
0

我有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 

所以...跆拳道?

爲自己更改殘差會導致斷言失敗?我檢查了它們是否與==,===,eq相同?它永遠是真的。我無法理解這是什麼錯誤。

我使用RSpec的1.3(它的軌道2.3應用程序,我不能升級到rspec2)

回答

2

RSpec的有是相等的對象沒有問題。這裏的問題是,在ActiveRecord中,兩個未保存的模型並不相同,即使它們具有所有相同的屬性。如果您運行puts (Residue.new == Residue.new),則可以看到此信息。

您必須保存Residue對象才能使其工作。

+0

但是 let(:residue){Residue.new} 應該記憶殘留物,所以它應該總是相同的實例。 r = Residue.new; puts(r == r); #=> true –

+0

好的 - 我看到這裏發生了什麼 - 「變化」匹配器是專門爲數字設計的。該示例失敗了https://github.com/dchelimsky/rspec/blob/master/lib/spec/matchers/change.rb#L21,即使您沒有收到非常好的失敗消息。 –

+0

我建議只是期望'document.producer_residue.should == residue'。 –