Factorygirl将has_many设为nil

时间:2016-11-14 15:55:22

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

我有一个user工厂默认为user_document

创建关联
FactoryGirl.define do
  factory :user do |u|
    sequence(:first_name) {|n| "firstname-#{n}" }
    after(:create) do |user|
      create(:user_document, document_type: :address_proof, user: user)
    end
  end
end

我想定义一个新的工厂,其关联user_document为null。我该怎么做呢 ?

[UPDATE]

当我这样做时

  factory :user_with_no_doc_buyer do
    user_document nil
  end

我收到错误说:

 NoMethodError: undefined method `user_document=' for #<User:0x007f97329c08f8>

当我这样做的时候 user_documents nil我得到了

NoMethodError: undefined method `each' for nil:NilClass

感谢

2 个答案:

答案 0 :(得分:1)

使用traits

FactoryGirl.define do
  factory :user do |u|
    sequence(:first_name) {|n| "firstname-#{n}" }
    trait :with_user_document
      after(:create) do |user|
        create(:user_document, document_type: :address_proof, user: user)
      end
    end
  end
end

使用文档创建用户

FactoryGirl.create(:user, :with_user_document)

创建具有空文档的用户

FactoryGirl.create(:user)

答案 1 :(得分:1)

我会创造两个特征。

FactoryGirl.define do
  factory :user do
    sequence(:first_name) {|n| "firstname-#{n}" }

    trait :with_document do
      after(:create) do |user|
        create(:user_document, document_type: :address_proof, user: user)
      end
    end

    trait :without_document do
      user_documents []
    end
  end
end

然后你只需要打电话给你需要的工厂。

例如

FactoryGirl.create(:user, :with_document)

编辑:您已经看到希望with文档成为默认文档。这很容易。您可以使用您拥有的代码,并在没有文档的情况下提出我的建议,您可以在需要时调用该文档。