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

all*_*ire 8 ruby-on-rails factory-bot

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

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

谢谢

Nob*_*ita 5

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

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

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

它也非常酷的是,您可以覆盖特定的属性,因此,如果您想覆盖属性速度,您可能有这样的东西:

Given /^I have a car running^/
 Factory :car, speed => 100
end
Run Code Online (Sandbox Code Playgroud)

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

  • 反驳:所有这些论点也适用于固定装置。整体而言,夹具速度更快。还有其他原因吗? (2认同)

pja*_*mer 5

工厂

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

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

赛程

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

夹具是模型的最终状态并存在于数据库中,因此加载一次,并且可以在您认为合适的测试中使用.

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

NewModel.create(...)

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

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

工厂优于NewModel.create

一个文件要维护,而不是在我们的代码行中使用多个build或替换create.

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