1

No Rails Specs のパスでは、モデルが 1 つだけ、または最大で 2 つの関連付けが指定されている例しか見たことがありません。ネスティングが深いアプリケーションにどう適用するか迷っています。たとえば、次はネストされた例です。

Survey
  has_many :questions

Question
  has_many :answers

Answer
  belongs_to :user

User
  has_many :surveys
  has_many :answers

Answer モデルをテストするための仕様、スタブ/モック オブジェクトの書き方

私の質問の要点は、ネストされたモデルの最下位レベルをテストしているときに、常に捕まるということです。

4

1 に答える 1

1

私の2セント(同じ目標に向かって取り組んでいるため):

  • ペストのようなデメテルの法則違反を避けてください。オブジェクトが別のオブジェクトの構造を深く掘り下げるほど、より多くのオブジェクトをスタブ/モックする必要があります。

  • OpenStruct はあなたの友達です!

  • 深くネストされたオブジェクトからのデータが必要な場合は常に、次の 2 つのことを考慮してください。

    1. 必要なデータを返す中央のオブジェクトにメソッドを記述します。
    2. リレーションをラップするオブジェクトを作成する

Avdi Grimm のObjects on Rails book から、私が本当に役立つと思った 1 つのパターンは次のとおりです。

class YourObject
  def make_related_object
    related_object_maker.call
  end

  def related_object_maker=(maker)
    @related_object_maker = maker
  end

  private
  def related_object_maker
    @related_object_maker ||= RelatedObject.public_method(:new)
  end
end

これにより、テストで関係をラムダに置き換えることができます。これは非常に便利です。

編集

describe YourObject do
  let(:maker) { lambda { "some value" } }
  subject { YourObject.new }

  before(:each) do
    subject.related_object_maker = maker
  end

  its(:make_related_object) { should == "some value" }
end
于 2012-05-18T21:15:53.090 に答える