【发布时间】:2012-11-01 22:08:12
【问题描述】:
这可能是我的一个基本误解。我的应用程序中有一堆逻辑,它从几个表中收集数据集并将它们组合成内存结构。我想为该逻辑编写测试。
在我看来,fixtures、factory girl 和类似工具构建内存模型实例。如果我进行 activerecord 调用,例如Model.find(foo: 12),这些调用不会仅适用于已保存的记录吗?
【问题讨论】:
标签: ruby-on-rails activerecord fixtures
这可能是我的一个基本误解。我的应用程序中有一堆逻辑,它从几个表中收集数据集并将它们组合成内存结构。我想为该逻辑编写测试。
在我看来,fixtures、factory girl 和类似工具构建内存模型实例。如果我进行 activerecord 调用,例如Model.find(foo: 12),这些调用不会仅适用于已保存的记录吗?
【问题讨论】:
标签: ruby-on-rails activerecord fixtures
在大多数情况下,我同意@mrbrdo 的观点:更喜欢rpsec 的存根方法。但是作为一个 Rails 程序员,我认为你必须知道“fixture”和“stub”。
无论是yaml 文件还是factory girl data,夹具都将保存到数据库中。查看您的config/database.yml 文件以了解它们所在的位置。实际上,当您想确保测试期间数据库中始终存在一些数据时,这很有用,例如具有固定 ID 的“管理员用户”。
存根,它比夹具更快,因为它不会保存到数据库中,当您想要执行“夹具”无法实现的测试时,它可能非常有用。
因此,我建议您在实际的编码生活中尝试这两种方法,并根据实际情况选择其中一种。
【讨论】:
你说的不是真的,夹具或工厂女孩会使用数据库。不过,我会避免使用固定装置,但现在人们通常不使用它们。
不过,真正编写测试的正确方法是将 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)
这比实际在数据库中创建它然后将其拉出要快得多,而且对于您正在测试的内容这样做没有意义 - 这并不重要。您还可以在实例上存根保存等,具体取决于您的方法正在执行的操作。请记住,从 DB 检索数据并保存到 DB 都已经在 activerecord 的测试中进行了测试,您没有必要重新进行这些测试 - 只需专注于您的特定逻辑即可。
【讨论】:
FactoryGirl 支持多种构建策略,包括一种将记录保存到数据库的策略。
很简单:FactoryGirl.create(:foo) 将创建一个 foo 并将其保存到数据库中,而 FactoryGirl.build(:foo) 将只创建该对象的内存版本。
有关构建策略的更多信息,请点击此处:https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md,在“使用工厂”部分。
【讨论】: