FactoryGirl:如何在幕后处理belongs_to在线验证?

时间:2017-10-25 16:21:04

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

我有一家工厂,如下所示:

FactoryGirl.define do
  factory :product do
    name 'John'
  end
end

我有很多规格使用这个工厂:

product = create :product

我现在添加了一个Product belongs_to :user关联,并在状态下对其进行验证:

class Product < ApplicationRecord
  validates :user, presence: true
end

我现在必须重构我所有的工厂电话(或类似的东西):

product = create :product, user: create(:user)

这对我来说似乎很麻烦。我想FactoryGirl自动为我做这件事。它应该是这样的:

  • 每当创建产品时,FactoryGirl会自动添加用户:
    • 如果数据库中已有用户,则指定此用户
    • 如果数据库中没有用户,则创建一个用户

这样做有好办法吗?我想避免在创建产品时查询数据库是否存在用户。

此外,它可能很危险,因为现有用户可能会在测试期间被销毁,然后会丢失到任何后续创建的产品中。

这有更好的模式吗?

我看过像验证ID而不是对象的内容:

validates :user_id, presence: true

然后在创建对象时简单地指定一个不存在的ID:

product = create :product, user_id: 123456

这是一个好模式吗?

我所有深度嵌套/关联的资源很快就会有belongs_to :user个关联。我想避免在我的规范中到处写user: create(:user)(或user: @user)。

我确信这有一个久经考验的模式......?

1 个答案:

答案 0 :(得分:2)

  

可以在工厂内建立关联。如果是工厂   name与关联名称相同,可以保留工厂名称   出。
  http://www.rubydoc.info/gems/factory_bot/file/GETTING_STARTED.md#Associations

FactoryGirl.define do
  factory :product do
    name 'John'
    user
  end
end