5

ActiveRecord オブジェクトの属性が変更されていないかどうかを確認したいと考えています。現在、私はこれをやっています:

prev_attr = obj.attributes<-これにより、属性名と属性値を含むハッシュが返されます

その後、属性を再度取得し、2 つのハッシュを比較します。別の方法はありますか?

4

4 に答える 4

11

実は別の方法があります。あなたはこのようにすることができます:

it "should not change sth" do
  expect {
    # some action
  }.to_not change{subject.attribute}
end

https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/expect-changeを参照してください。

于 2012-05-07T10:33:24.983 に答える
3

ActiveRecord::Dirtyを使用できます。changed?モデルの属性が実際に変更された場合は true であり、変更されていない場合は false であるモデルのメソッドを提供します。オブジェクトがデータベースから読み取られたときと比較して、その属性が変更された場合_changed?など、各属性のメソッドもあります。model.subject_changed?

属性値を比較するmodel.subject_wasには、オブジェクトがインスタンス化されたときに属性が持っていた元の値になります。model.changesまたは、キーとして属性名を持つハッシュと、変更された各属性の元の値と変更された値を含む 2 要素配列を返す which を使用できます。

于 2012-05-07T11:29:52.033 に答える
2

等価マッチャーを使用できるはずです-これは機能しませんか?

a = { :test => "a" }
b = { :test => "b" }
$ a == b
=> false
b = { :test => "a" }
$ a == b
=> true

またはあなたの例を使用するには:

original_attributes = obj.attributes
# do something that should *not* manipulate obj
new_attributes = obj.attributes
new_attributes.should eql original_attributes
于 2012-05-07T08:28:17.337 に答える