10

当您可以在测试中简单地使用 ActiveRecord 来创建数据库条目时,工厂/装置的目的是什么(我知道工厂的作用类似于装置,但更清楚一点)?即 News.create(…)

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

谢谢

4

3 回答 3

5

工厂

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

您在一个文件中定义对象的“快乐路径”,包括关联(如 ryan 所提到的),然后只在架构/模型关联发生变化时维护一个文件。

夹具

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

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

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

新模型.create(...)

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

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

工厂相对于 NewModel.create 的优势

要维护一个文件,而不是在您的代码行中查找和替换多个build或替换create

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

于 2012-12-22T12:34:51.730 回答
4

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

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

一旦你用对应的结构在一个地方定义了工厂,你所要做的就是请求一个汽车,工厂将把汽车与其他模型的所有依赖关系拿走。这不是很酷吗?最后,您希望在这一点上专注于测试。

它也很酷的是你可以覆盖特定的属性,所以你可能有这样的东西,如果你想覆盖属性速度:

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

从我谦虚的角度来看,我喜欢 Factory Girl,因为它使我的测试代码易于维护并且非常易于阅读。

于 2012-04-14T17:05:08.537 回答
2

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

如果我想更改默认标题或添加另一个属性,我会在一个文件中进行。由于 AR 在我的测试中到处都是,我需要在每次使用时都改变它。

于 2012-04-14T16:43:23.150 回答