当您可以在测试中简单地使用 ActiveRecord 来创建数据库条目时,工厂/装置的目的是什么(我知道工厂的作用类似于装置,但更清楚一点)?即 News.create(…)
我只是看不到使用 Factory Girl 的任何优势,而不是简单地使用 ActiveRecord 方法创建一个新用户,比如说一个新用户..
谢谢
当您可以在测试中简单地使用 ActiveRecord 来创建数据库条目时,工厂/装置的目的是什么(我知道工厂的作用类似于装置,但更清楚一点)?即 News.create(…)
我只是看不到使用 Factory Girl 的任何优势,而不是简单地使用 ActiveRecord 方法创建一个新用户,比如说一个新用户..
谢谢
创建/构建一个对象,然后仅在测试中调用它时才使用它。
您在一个文件中定义对象的“快乐路径”,包括关联(如 ryan 所提到的),然后只在架构/模型关联发生变化时维护一个文件。
模拟单个记录的数据库应该是什么样子,将其加载到测试数据库中然后使用。
Fixtures 是模型的最终状态并存在于数据库中,因此只加载一次,并且可以在您认为合适的情况下用于测试。
多个文件,您布置您的夹具文件,以便处理每个文件和关联。
before(:each)
在一个测试或一个块中创建一次并使用一次
如果你有 100 个这样的块,那就是编写和维护 100 个不同的对象,更不用说像@user.profile.create(....)
100 次这样的关联了。
要维护一个文件,而不是在您的代码行中查找和替换多个build
或替换create
。
注意
必须说,在我的测试套件中,我希望它尽可能快,所以我放弃了 FactoryGirl 并使用 Fixtures 和 NewModel.create 继续前进。就是看看能不能加速。我正在研究FG正在减慢我的套件速度的理论,let()
并且before(:each)
拥有工厂并遵循测试数据构建模式将使您提前做一些工作,但会真正节省您的时间和未来的工作。
假设您有一个 Car 模型,并且该 Car 有一个 Owner,并且该 Owner 需要一个地址。每个人都有其他领域。如果您想遵循直接使用模型的方法,则必须在需要它们的每个步骤定义中创建这些对象(以及对应关系)。与工厂?您只需定义一次。
一旦你用对应的结构在一个地方定义了工厂,你所要做的就是请求一个汽车,工厂将把汽车与其他模型的所有依赖关系拿走。这不是很酷吗?最后,您希望在这一点上专注于测试。
它也很酷的是你可以覆盖特定的属性,所以你可能有这样的东西,如果你想覆盖属性速度:
Given /^I have a car running^/
Factory :car, speed => 100
end
从我谦虚的角度来看,我喜欢 Factory Girl,因为它使我的测试代码易于维护并且非常易于阅读。
工厂允许您将测试设置放在一个文件中。例如,我的项目工厂位于spec/support/factories/project_factory.rb
.
如果我想更改默认标题或添加另一个属性,我会在一个文件中进行。由于 AR 在我的测试中到处都是,我需要在每次使用时都改变它。