工厂女孩有没有通过关系?

时间:2014-01-11 22:10:51

标签: ruby-on-rails ruby factory-bot

我很难设置Factory Girl来模仿我的模型关联。我认为问题是我没有正确设置“用户通过订阅有一个计划”关联。非常感谢任何帮助!

我收到此错误:

 Failure/Error: let(:plan) {FactoryGirl.create(:plan, :user => user) }
 NoMethodError:
   undefined method `user=' for #<Plan:0x007fd836a1a340>

我的模型如下:

User.rb

has_one :subscription
has_one :plan, :through => :subscription
has_many :projects

Project.rb

belongs_to :user

Plan.rb

has_many :subscriptions

Subscription.rb

belongs_to :plan
belongs_to :user

我的FactoryGirl代码

FactoryGirl.define do

  factory :user do

    first_name "Joel"
    last_name "Brewer"
    email { "#{first_name}.#{last_name}@example.com".downcase }
    password "booyabooya"
    password_confirmation "booyabooya"
    user_type "entrepreneur"
  end

  factory :plan do |f|
    f.association :user
    f.plan_type "entrepreneur"
    f.plan_level "bronze"
    f.user_project_limit '1'
 end

  factory :subscription do |f|
    f.association :user
    f.association :plan
    f.stripe_card_token "Test card token"
    f.stripe_customer_token "Test customer token"
    f.email "joel.brewer1@example.com"
  end

  factory :project do
    title "Sample Project"
    user
  end
end

1 个答案:

答案 0 :(得分:1)

user=上的未定义方法错误是因为您没有为user定义Plan字段,但在association :user工厂中有:plan字段。假设您只希望计划通过订阅与用户关联,则需要将association :user:plan工厂中取出。

我并不完全清楚您可以使用的所有选项来处理您的情况,但假设您打算使用工厂调用是在创建计划的同时为指定用户创建订阅,那么以下(未经测试的)方法应该起作用,取自https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md

factory :plan do
  plan_type "entrepreneur"
  plan_level "bronze"
  user_project_limit '1'

  factory :plan_with_subscription do
    ignore { user }
    after(:create) do |plan, evaluator|
      create(:subscription, plan: plan, user: evaluator.user)
    end
  end

end

您希望将通话更改为使用:plan_with_subscription而不是:plan来启用订阅。