工厂/夹具与简单的Model.create(...)?

时间:2012-04-14 16:17:52

标签: ruby-on-rails factory-bot

当您在测试中使用ActiveRecord创建数据库条目时,工厂/装置的目的是什么(我知道工厂就像固定装置,但更清楚一点)?即News.create(...)

我只是没有看到使用Factory Girl的任何优势,而不是简单地使用ActiveRecord方法创建一个新用户说新用户..

由于

3 个答案:

答案 0 :(得分:5)

工厂

创建/构建一个对象,然后只在测试中调用它时才使用它。

您可以在一个文件中定义对象的“快乐路径”(包括关联)(如ryan所述),然后在架构/模型关联发生更改时保留一个文件。

照明灯

模仿数据库对于单个记录应该是什么样子,将其加载到测试数据库中然后使用。

灯具是模型的最终状态并存在于数据库中,所以加载一次,并且可以在您认为合适的情况下在测试中使用。

多个文件,您可以布置夹具文件,以便处理每个文件和关联。

NewModel.create(...)

创建一次并在一次测试或一次before(:each)块中使用一次

如果您有100个这样的块,那就是编写和维护100个不同的对象,更不用说像@user.profile.create(....)这样的关联100次了。

工厂优于NewModel.create

要维护一个文件,而不是在代码行中使用gre {和替换多个buildcreate

注意的 必须要说的是,在我的测试套件中我希望它尽可能快,所以我放弃FactoryGirl并使用Fixtures和NewModel.create向前移动。只是为了看它是否加快了速度。我正在研究FG正在减慢我的套件的理论,let()before(:each)

答案 1 :(得分:2)

工厂允许您将测试设置放在一个文件中。例如,我的项目工厂位于spec/support/factories/project_factory.rb

如果我想更改默认标题或者可能添加其他属性,我会在一个文件中执行此操作。随着AR在我的测试中到处散落,我需要在每次使用中更改它。

答案 2 :(得分:2)

拥有工厂并遵循测试数据构建模式将使您在前面做一些工作,但真的会节省您的时间和未来的工作。

假设您有一个汽车模型,并且该汽车拥有一个所有者,并且该所有者需要一个地址。其中每个都有其他领域。如果要遵循直接使用模型的方法,则必须在需要它们的每个步骤定义中创建这些对象(以及对应关系)。有工厂?您将仅定义一次

一旦您将工厂定义在一个具有相应结构的地方,您所要做的就是要求汽车和工厂将采用其他车型的所有依赖关系。那不是很酷吗?最后,您希望专注于测试

你可以覆盖特定属性,这也很酷,如果你想覆盖属性速度,你可能会有类似这样的事情:

Given /^I have a car running^/
 Factory :car, speed => 100
end

从我的卑微观点来看,我喜欢Factory Girl,因为它让我的测试代码很容易保持并且非常容易阅读。