2012-11-01 115 views
0

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

在我看来,夹具,工厂女孩和类似的工具建立内存模型实例。如果我进行activerecord调用,如Model.find(foo:12),那么这些调用是否仅适用于已保存的记录?谢谢!

回答

2

在大多数情况下,我同意@ mrbrdo的观点:prefer rpsec的存根方法。但作为一名rails程序员,我认为你必须知道“fixture”和“stub”。

无论是yaml文件还是factory girl data,灯具都会保存到数据库中。请参阅您的config/database.yml文件以了解它们的位置。实际上,当你想要确保在你的测试过程中总是有一些数据在数据库中时,这很有用,比如一个带有固定ID的“管理员用户”。

存根,它比夹具更快,因为它不会保存到数据库中,并且当您要执行无法通过“夹具”实现的测试时可能非常有用。

因此,我建议您在真实的编码生活中尝试两种方法,并根据真实的环境选择其中的任意一种。

+0

只需添加,即使您在所有测试中需要管理员用户,仍然不一定需要固定设备或数据库或存根。你可以有一个之前(:每个)与AdminUser.new用户名:... 这取决于你使用这个管理员用户的方式(如果它真的需要在数据库中),但即使这样你通常可以逃脱它如果你使用nulldb。不使用数据库唯一真正的缺点是它通常需要多一点时间来编写这样的测试,但在大多数情况下,测试总体上会更好(更快,更孤立)。 – mrbrdo

1

你在说什么不对,夹具或工厂女生使用数据库。但是,我会避免使用夹具,但现在人们通常不会使用它们。

但是真正编写测试的正确方法是将activerecord调用存根删除,因为这会使测试速度加快。你想要测试的是将数据结合到结构中,而不是将数据从数据库中提取出来 - 该部分已经在activerecord的测试中进行了测试。

所以存根出这样的发现者(如果你使用的RSpec):

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

所以,当你的方法正在测试电话Model.find(富:12),它会得到

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

这比在数据库中实际创建它然后将它拉出来要快得多,而且对于测试的内容没有任何意义 - 这并不重要。您也可以保存在实例上等等,具体取决于您的方法正在做什么。请记住,从数据库中检索数据并保存到数据库都已在activerecord的测试中进行过测试,您无需重新进行这些测试 - 只需关注您的特定逻辑即可。

+0

谢谢!后续......我的情况涉及4个表格,它们以4个belongs_to,has_many对彼此错综复杂地相互连接。 (基本上3个表格是沿着行,列和页面的索引,并且第四个模型表示一个值。要点是,会有很多细微的瑕疵......我发现速度上的优势,但我很可能在编写存根时犯错,就像我在实际的代码中一样。 – pitosalas

+0

我不确定你在问什么,但你只需要在你正在测试的代码中存储你实际使用的东西。所以如果你不打电话给一些关联,那么你不需要存根。 你可以使用另一个工具,如果你想有这样的快速测试是nulldb:https://github.com/nulldb/nulldb。您也可以将FactoryGirl.build和nulldb一起用于关联。 当然,您可以在数据库中创建记录并且工作正常(例如使用factory_girl),它会变得更慢。 – mrbrdo