我很难设置Factory Girl来模仿我的模型关联。我认为问题是我没有正确设置“用户通过订阅有一个计划”关联。非常感谢任何帮助!
我收到此错误:
Failure/Error: let(:plan) {FactoryGirl.create(:plan, :user => user) }
NoMethodError:
undefined method `user=' for #<Plan:0x007fd836a1a340>
我的模型如下:
has_one :subscription
has_one :plan, :through => :subscription
has_many :projects
belongs_to :user
has_many :subscriptions
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
答案 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
来启用订阅。