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

时间:2011-06-22 07:47:51

标签: ruby-on-rails ruby-on-rails-3 associations has-many-through factory-bot

我是测试和factory_girl的新手,我想使用factory_girl为has_many通过关联创建工厂。
我在网上看过很多文章,但看不出最好的方法 我有两个模型,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

直到现在,我已经尝试过这个:

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

    要求'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:未定义的方法`widget_id ='for#

    然后,如果我添加

      

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

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

      

    /factory_girl/factory.rb:334:在`factory_by_name':没有这样的工厂:widget(ArgumentError)

    我不知道该怎么办。我相信我没有做对。为这种协会创建工厂的最佳方式是什么 我应该在WidgetFeature OR WigdetFeature ??

    中创建关联

1 个答案:

答案 0 :(得分:0)

尝试更改该行:

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

进入

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