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 を使用しています (Rails 2.3 アプリです。rspec2 にアップグレードできません)。

4

1 に答える 1

2

RSpec は、等しいオブジェクトには何の問題もありません。ここでの問題は、ActiveRecord では、保存されていない 2 つのモデルがすべて同じプロパティを持っていても、同等とは見なされないことです。を実行すると、これを見ることができますputs (Residue.new == Residue.new)

これを機能させるには、Residue オブジェクトを保存する必要があります。

于 2012-05-22T15:21:12.113 に答える