1

这可能是我的一个基本误解。我的应用程序中有一堆逻辑,它从几个表中收集数据集并将它们组合到内存结构中。我想为该逻辑编写测试。

在我看来,fixtures、factory girl 和类似的工具构建了内存模型实例。如果我进行 activerecord 调用,Model.find(foo: 12)那么这些调用是否仅适用于已保存的记录?

4

3 回答 3

2

在大多数情况下,我同意@mrbrdo 的意见:更喜欢rpsec 的存根方法。但作为 Rails 程序员,我认为您必须同时了解“夹具”和“存根”。

固定装置,无论是yaml文件还是 . factory girl data,都将保存到数据库中。查看您的config/database.yml文件以了解它们所在的位置。实际上,当您想确保测试期间数据库中始终存在一些数据时,这很有用,例如具有固定 ID 的“管理员用户”。

Stubs, it's faster than fixture since it won't be saved into DB, and maybe very useful when you want to perform a test that can't implemented by "Fixtures".

So, I suggest that you try both of them in your real coding life, and choose either of them according to the real context.

于 2012-11-01T22:24:45.647 回答
1

你说的不是真的,夹具或工厂女孩使用数据库。不过,我会避免使用固定装置,现在人们通常不使用它们。

不过,真正编写测试的正确方法是将 activerecord 调用存根,因为这将使您的测试更快。您要测试的是将数据组合到您的结构中,而不是将数据从数据库中提取出来——该部分已经在 activerecord 的测试中进行了测试。

所以像这样存根查找器(如果您使用的是rspec):

Model.should_receive(:find).with(foo: 12) do
  Model.new(foo: 12, other_attribute: true)
end

因此,当您正在测试的方法调用 Model.find(foo: 12) 时,它会得到

Model.new(foo: 12, other_attribute: true)

这比实际在数据库中创建它然后将其拉出要快得多,并且对于您正在测试的内容没有意义 - 这并不重要。您还可以在实例上存根保存等,具体取决于您的方法正在执行的操作。请记住,从数据库检索数据并保存到数据库都已经在 activerecord 的测试中进行了测试,您没有必要重新进行这些测试 - 只需关注您的特定逻辑。

于 2012-11-01T22:17:48.123 回答
1

FactoryGirl 支持多种构建策略,包括一种将记录保存到数据库的策略。

这很简单:FactoryGirl.create(:foo)将创建一个foo并将其保存到数据库中,而FactoryGirl.build(:foo)只会创建该对象的内存版本。

有关构建策略的更多信息,请参见此处:https ://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md ,在“使用工厂”部分。

于 2012-11-01T22:19:27.330 回答