9

ActiveRecord::Baseオブジェクトの検索と保存の両方のための複数のメソッドを備えた大規模な古い API があります。たとえば、AR::Bオブジェクトはいくつかのメソッドからインスタンス化されている可能性があります。

  • Foo.new(…)
  • Foo.create(…)
  • Foo.find(…)
  • Foo.find_by_sql(…)
  • Foo.find_[all_]by_*(…)
  • bar.foos(協会)
    • …もちろん、関連付けに関するファインダ メソッド

同様に、問題のオブジェクトは、いくつかの異なる方法で永続化される場合があります。

  • foo.createまたfoo.create!
  • foo.saveまたfoo.save!
  • foo.update_attributesまたfoo.update_attributes!

ここで、単体テストを作成するときは、外部メソッドの呼び出しをスタブ化して、テストで問題のメソッドのビジネス ロジックに集中できるようにすることをお勧めします。ただし、AR::Bコントローラー単体テストなどでオブジェクトを操作する場合は、上記のメソッドのいずれかにコミットする必要があるように思われますが、実際にはメソッドのビジネス ロジックに関する限り重要ではありません。あなたが選ぶ。

メソッドの動作をその実装とこれほど緊密に結合する必要がありますか、それとも単純なものが欠けていますか?

4

1 に答える 1

3

ActiveRecord::Base1 つのアプローチは、独自のメソッドでメソッド呼び出しをラップするような方法でクラスを構築することです。

だから、直接電話する代わりにFoo.new(…)...

class Foo < ActiveRecord::Base
  def self.create_object(…)
    new(…)
  end
end

そうすれば、テストで ActiveRecord のメソッドの代わりに独自のメソッドをスタブ化できます。

このアプローチ (その利点を含む) は、本「Objects On Rails」で Avdi Grimm によって詳細に概説されています... http://objectsonrails.com

于 2012-03-15T13:39:48.443 に答える