当您在测试中使用ActiveRecord创建数据库条目时,工厂/装置的目的是什么(我知道工厂就像固定装置,但更清楚一点)?即News.create(...)
我只是没有看到使用Factory Girl的任何优势,而不是简单地使用ActiveRecord方法创建一个新用户说新用户..
由于
答案 0 :(得分:5)
创建/构建一个对象,然后只在测试中调用它时才使用它。
您可以在一个文件中定义对象的“快乐路径”(包括关联)(如ryan所述),然后在架构/模型关联发生更改时保留一个文件。
模仿数据库对于单个记录应该是什么样子,将其加载到测试数据库中然后使用。
灯具是模型的最终状态并存在于数据库中,所以加载一次,并且可以在您认为合适的情况下在测试中使用。
多个文件,您可以布置夹具文件,以便处理每个文件和关联。
创建一次并在一次测试或一次before(:each)
块中使用一次
如果您有100个这样的块,那就是编写和维护100个不同的对象,更不用说像@user.profile.create(....)
这样的关联100次了。
要维护一个文件,而不是在代码行中使用gre {和替换多个build
或create
。
注意的
必须要说的是,在我的测试套件中我希望它尽可能快,所以我放弃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,因为它让我的测试代码很容易保持并且非常容易阅读。