定义一个孩子" "让"中的变量

时间:2015-01-03 13:55:17

标签: ruby-on-rails ruby rspec

我想测试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

但它并没有成功。

2 个答案:

答案 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),导致该文章永远不会与您的用户相关联。