我经常听到在编写测试时不使用随机数据,这对大多数数据来说似乎都是合理的。
但是,我认为我有可能需要的情况。我正在处理的代码有一些非AR模型。例如,用户模型没有DB表支持,因为我们在via API中提取这些记录。
其他AR支持的模型是"关联"通过FK到非AR用户模型,但它们不是AR关联。因此,我无法在FactoryBot中使用owner
进行隐式关联,我必须手动设置owner_id
属性。
目前正在通过sequence(:owner_id)
这样做......
FactoryGirl.define do
factory :dog do
sequence(:owner_id)
name "Sparky"
legs 4
end
end
end
问题是,由于多个工厂使用序列手动设置owner_id
FK,但FactoryBot不知道它们引用相同的模型,因此序列不会串联递增。
因此,当上述dog
工厂user_id
为1
且另一家工厂也将user_id
设置为1
时,会出现间歇性规范。这使得数据看起来是关联的,因为它不应该是,这是一些规格间歇性失败的根本原因 - 数据似乎与它不应该相关(因为无意中对齐的FK)。
虽然我认为这听起来确实是一个更大的设计问题,但我试图找到一个快速修复,因为许多现有的规格取决于当前的设计,我没有时间去做所有的重构
所以,这就是我想要做以下事情的原因:
FactoryGirl.define do
factory :dog do
owner_id { rand(1_000_000) }
name "Sparky"
legs 4
end
end
end
我知道这并不能保证唯一性,但我认为这会使偶尔失败的间歇性规格现在基本上消失了。
仅供参考:这个问题已经有了很大的更新,因为有些答案进来了,谢谢大家的回复,对不起,如果更新后的问题在某种程度上脱离了上下文,那就很抱歉了:( < / p>
答案 0 :(得分:3)
简单的反例 - 你试图创造两只狗。恰好骰子滚动相同的数字。由于id
不是唯一的,您的规范现在失败了。
另外,一般来说,我不希望您在创建记录时设置id
。你最有可能让它们自动增量。
如果您使用随机性只是为了使每条记录的某些值不同,您可以改为使用序列:
sequence(:name) { |n| "Sparky No#{n}" }