我想测试2个模型:文章和用户。用户has_many文章。在其中一个测试用例中,我定义了一个变量:
context 'some context' do
let(:my_user) { FactoryGirl.create(:user) }
如何创建属于my_user
的100篇文章?我试过这个:
let(:my_user) { FactoryGirl.create(:user, articles: [build(:article)]) } # error
# or
let(:article) { FactoryGirl.create(:article, user: my_user) } # doesn't work
it 'fdsfdsfs' do
# my_user.articles still has no articles
end
但它并没有成功。
答案 0 :(得分:1)
您可以使用回调在工厂本身执行此操作,也可以使用create_list
执行此操作:
let!(:user) { FactoryGirl.create(:user) }
let!(:article) { FactoryGirl.create_list(:article, 100, user: user) }
我在这里使用let!
可能没有必要,但因为您没有展示整个测试,我无法确定是否所有内容都是延迟加载的。
要使用回调来做,我喜欢这样做:
FactoryGirl.define do
factory :user do
sequence(:email) { |n| "user#{n}@email.com" }
password 'password'
factory :user_with_articles do
after(:create) do |user|
create_list(:article, 100, user: user)
end
end
end
end
现在在你的测试中你可以做到
let(:user) { FactoryGirl.create(:user_with_articles) }
这将创建一个包含100篇文章的用户。
答案 1 :(得分:1)
作为对正确答案https://stackoverflow.com/a/27756067/1008891的补充,您的首次尝试失败似乎是因为您尝试调用FactoryGirl.build
而未对build
的引用进行限定而您的第二次尝试失败,因为{ {1}}进行了懒惰评估,您从未在测试中引用let(:article)
,导致该文章永远不会与您的用户相关联。