当FK关联对象不是AR关系时,可以在FactoryBot定义中使用随机FK ID吗?

时间:2018-03-29 21:22:16

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

我经常听到在编写测试时不使用随机数据,这对大多数数据来说似乎都是合理的。

但是,我认为我有可能需要的情况。我正在处理的代码有一些非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_id1且另一家工厂也将user_id设置为1时,会出现间歇性规范。这使得数据看起来是关联的,因为它不应该是,这是一些规格间歇性失败的根本原因 - 数据似乎与它不应该相关(因为无意中对齐的FK)。

虽然我认为这听起来确实是一个更大的设计问题,但我试图找到一个快速修复,因为许多现有的规格取决于当前的设计,我没有时间去做所有的重构

所以,这就是我想要做以下事情的原因:

FactoryGirl.define do
  factory :dog do
    owner_id { rand(1_000_000) }
    name "Sparky"
    legs 4
   end
  end
end

我知道这并不能保证唯一性,但我认为这会使偶尔失败的间歇性规格现在基本上消失了。

仅供参考:这个问题已经有了很大的更新,因为有些答案进来了,谢谢大家的回复,对不起,如果更新后的问题在某种程度上脱离了上下文,那就很抱歉了:( < / p>

1 个答案:

答案 0 :(得分:3)

简单的反例 - 你试图创造两只狗。恰好骰子滚动相同的数字。由于id不是唯一的,您的规范现在失败了。

另外,一般来说,我不希望您在创建记录时设置id。你最有可能让它们自动增量。

如果您使用随机性只是为了使每条记录的某些值不同,您可以改为使用序列:

sequence(:name) { |n| "Sparky No#{n}" }