1

在 No Rails Specs 的道路上,我只看到了仅给出一个模型或最多 2 个关联的示例。我想知道如何应用于具有深层嵌套的应用程序。例如,以下是一个嵌套示例,

Survey
  has_many :questions

Question
  has_many :answers

Answer
  belongs_to :user

User
  has_many :surveys
  has_many :answers

如何编写规范、存根/模拟对象来测试答案模型?

我的问题的要点是我在测试最低级别的嵌套模型时总是被抓住。

4

1 回答 1

1

我的 2 美分(因为我一直在朝着同一个目标努力):

  • 避免像瘟疫一样违反得墨忒耳法则。您的对象越深入到另一个对象的结构中,您必须存根/模拟的对象就越多。

  • OpenStruct 是你的朋友!

  • 每当您需要来自深度嵌套对象的数据时,请考虑两件事:

    1. 在中间的对象上写一个方法,它将返回你想要的数据。
    2. 创建一个包装关系的对象

我发现Avdi Grimm 的Objects on Rails一书中非常有用的一种模式是:

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

这使您可以在测试中用 lambda 替换关系,这非常方便。

编辑

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 回答