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,您也会使用事务回滚。在测试之间保留数据是危险的,因为它会带来排序问题(测试只有在按顺序运行时才通过)。不,这不应该是您认为的方式。工厂应该创建模型的独特实例。它们不应该给出由外部状态(先前存在的模型)决定的不同输出。