如何通过关联为 has_many 定义工厂

Posted

技术标签:

【中文标题】如何通过关联为 has_many 定义工厂【英文标题】:How to define factories for a has_many through association 【发布时间】:2011-06-22 07:47:51 【问题描述】:

我是 testing 和 factory_girl 的新手,我想通过关联创建使用 factory_girl 的工厂。 我在网上看过很多文章,但找不到最好的方法。 我有两个模型,WidgetFeature。 这些关联是:

class Feature < ActiveRecord::Base
  has_many :widget_features
  has_many :widgets, :through => :widget_features
end

class Widget < ActiveRecord::Base
  has_many :widget_features
  has_many :features, :through => :widget_features
end

到目前为止,我已经尝试过:

    在我的 widget_feature_spec.rb 中,我这样做了

需要'spec_helper'

describe WidgetFeature do

  context "- METHOD - method_name " do
    it "should do blah" do
      widget = Factory.create(:widget)
      10.times  |i| Factory.create(:feature, :widget_id => widget.id)
      result = WidgetFeature.method_name(widget.id)
      # do all the checks and expectations now
    end
  end
end

很多工厂都是

Factory.define :feature do |f|
  f.name "Feature_name"
  f.description "Feature_description"
  f.association :widget
end

Factory.define :widget do |f|
  f.sequence(:title) |n| "Widget_title#n"
end

但自动测试失败,出现此错误:

NoMethodError:undefined method `widget_id=' for #

那么,如果我添加

f.widget_id Factory.create(:widget).id

对于我的功能工厂,我收到此错误,

/factory_girl/factory.rb:334:in `factory_by_name': No such factory: widget (ArgumentError)

我不知道该怎么办。我相信我没有做对。为此类协会创建工厂的最佳方式是什么。 我应该在WidgetFeatureWigdetFeature 中创建关联吗??

【问题讨论】:

我假设您有一个未向我们展示的 widget_features 连接表,是吗? 【参考方案1】:

尝试换行:

10.times  |i| Factory.create(:feature, :widget_id => widget.id)

进入

10.times  |i| Factory.create(:feature, :widget => widget)

【讨论】:

以上是关于如何通过关联为 has_many 定义工厂的主要内容,如果未能解决你的问题,请参考以下文章

如何通过rails中的关联定义has_many

Ecto - 如何通过特定查询获取“has_many”

如何通过关联在 has_many 中使用回调?

使用 has_many 时如何创建关联模型的实例:通过关联

如何通过“has_many”关联获取数据?

通过关联设置 has_many