Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails FactoryGirl:如何在幕后处理状态验证?_Ruby On Rails_Factory Bot_Model Associations - Fatal编程技术网

Ruby on rails FactoryGirl:如何在幕后处理状态验证?

Ruby on rails FactoryGirl:如何在幕后处理状态验证?,ruby-on-rails,factory-bot,model-associations,Ruby On Rails,Factory Bot,Model Associations,我的工厂如下: FactoryGirl.define do factory :product do name 'John' end end 我有很多这样使用工厂的规格: product = create :product 我现在添加了一个产品所属:user关联,并在出现时验证它: class Product < ApplicationRecord validates :user, presence: true end 这对我来说似乎是个麻烦。我想让FactoryG

我的工厂如下:

FactoryGirl.define do
  factory :product do
    name 'John'
  end
end
我有很多这样使用工厂的规格:

product = create :product
我现在添加了一个
产品所属:user
关联,并在出现时验证它:

class Product < ApplicationRecord
  validates :user, presence: true
end
这对我来说似乎是个麻烦。我想让FactoryGirl自动为我做这件事。应该是这样的:

product = create :product
  • 每当创建产品时,FactoryGirl都会自动添加用户:
    • 如果数据库中已经有一个用户,它将分配该用户
    • 如果数据库中没有用户,则创建一个用户
有什么好办法吗?我希望避免在创建产品时查询数据库中是否存在用户


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

有更好的模式吗

我见过像验证ID而不是对象这样的东西:

validates :user_id, presence: true
product = create :product, user_id: 123456
然后在创建对象时简单地分配一个不存在的ID:

validates :user_id, presence: true
product = create :product, user_id: 123456
这是一个好的模式吗

我所有的深度嵌套/关联资源都应该很快有一个
属于:user
关联。我希望避免在我的规范中的任何地方都必须编写
user:create(:user)
(或
user:@user

我相信这有一个行之有效的模式

在工厂内建立协会是可能的。如果工厂 名称与关联名称相同,工厂名称可以保留 退出。

在工厂内建立协会是可能的。如果工厂 名称与关联名称相同,工厂名称可以保留 退出。


我理解你的意思,但我要说的是,没有太多的魔法是很酷的:)“而且,这可能是危险的,因为现有用户可能在测试过程中被破坏,然后会丢失到任何后续创建的产品中。”这是错误的想法。您应该使用database_cleaner在测试之间清理整个数据库。即使使用fixture,您也会使用事务回滚。在测试之间保留数据是危险的,因为它会带来排序问题(测试只有在按顺序运行时才通过)。不,这不应该是您认为的方式。工厂应该创建模型的独特实例。他们不应该给出由外部状态决定的不同输出(什么模型是先存在的)。我理解你的意思,但我要说的是,没有太多的魔力是很酷的:)“而且,这可能是危险的,因为现有用户可能在测试中被破坏,然后会丢失到任何后续创建的产品中。”这是错误的想法。您应该使用database_cleaner在测试之间清理整个数据库。即使使用fixture,您也会使用事务回滚。在测试之间保留数据是危险的,因为它会带来排序问题(测试只有在按顺序运行时才通过)。不,这不应该是您认为的方式。工厂应该创建模型的独特实例。它们不应该给出由外部状态(先前存在的模型)决定的不同输出。