访问 *other* 工厂中的 factory_girl 工厂

Posted

技术标签:

【中文标题】访问 *other* 工厂中的 factory_girl 工厂【英文标题】:Accessing factory_girl factories in *other* factories 【发布时间】:2011-01-15 01:48:50 【问题描述】:

我在我的rails 应用程序中使用factory_girl 插件。对于每个模型,我都有一个包含工厂数据的相应 ruby​​ 文件,例如

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  # t.user ???
end

我有很多不同类型的用户(已经在用户工厂中定义)。如果我尝试以下方法:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user Factory(:valid_user) # Fails
end

我收到以下错误:

# No such factory: valid_user (ArgumentError)

:valid_user 实际上是有效的——我可以在我的测试中使用它——只是不能在我的工厂中使用。有什么办法可以在这里使用另一个文件中定义的工厂吗?

【问题讨论】:

【参考方案1】:

从问题的年龄来看,可能是 Factory Girl 的新功能,但如果您在工厂中的属性名称与工厂名称相同,则只需调用工厂中的属性名称即可填充它与相关的工厂代。

FactoryGirl.define do
   factory :thing do
     user
   end
end

这应该会导致用户字段查找具有相同名称的工厂并从中填充它。

【讨论】:

【参考方案2】:

你应该使用这个代码:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.user  Factory(:valid_user) 
end

将调用包装在 中会导致 Factory Girl 在创建 :valid_thing 工厂之前不会评估大括号内的代码。这将迫使它等到 :valid_user 工厂已加载(您的示例失败,因为它尚未加载),它还将导致为每个 :valid_thing 创建一个新的 :valid_user 而不是为所有用户创建相同的用户:valid_thing's (这可能是你想要的)。

【讨论】:

这很好用。只要知道Factory(:valid_user) 语法已被弃用;请改用FactoryGirl.create(:valid_user) 当我尝试构建时使用create(:valid_user)(:valid_thing)实际上会进行创建,对吗?有没有办法让这个引用泛型根据被调用来创建/构建? @mpgarate - 不,构建不会 Factory(:valid_user) 语法在这一点上不仅被弃用;它现在完全消失了,没有弃用消息。您可以简单地使用create(:valid_user),而不使用FactoryGirl【参考方案3】:

尝试使用关联方法,例如:

Factory.define :valid_thing, :class => Thing do |t|
  t.name 'Some valid thing'
  t.association :valid_user
end

【讨论】:

你也可以t.association :user, factory: :valid_user

以上是关于访问 *other* 工厂中的 factory_girl 工厂的主要内容,如果未能解决你的问题,请参考以下文章

设计模式在实际业务应用中的介绍之1——抽象工厂模式实现对数据库访问组件的封装

Vulnerabilities in other authentication mechanisms其他身份验证机制中的漏洞

css中a.other:hover,这个是啥意思?

linux虚拟机挂载了实体机的文件夹,无法分配other权限

Q: ossfs挂载时如何设置权限?

就不能换DB吗? 抽象工厂模式