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

OK to use random FK ID in FactoryBot definition when FK associated object is not an AR relation?

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

但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库 table 支持,因为我们通过 API.

提取这些记录

其他 AR 支持的模型通过 FK "associated" 到非 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 时,存在间歇性规格.这使得数据在不应该关联的时候看起来是关联的这是一些规范间歇性失败的根本原因 - 数据在不应该关联的时候看起来是关联的(因为无意中对齐FKs).

虽然我认为这听起来确实像是一个更大的设计问题,但我正试图找到一个快速解决方案,因为许多现有规范都取决于当前的设计,而且我没有时间进行所有重构。

所以,这就是我想要执行以下操作的原因:

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

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

仅供参考:自从有了一些答案以来,这个问题已经进行了重大更新,谢谢大家的回复,如果更新后的问题使一些现有答案有点断章取义的话,我深表歉意:(

简单的反例 - 你尝试创造两条狗。碰巧骰子掷出相同的数字。由于 id 不是唯一的,您的规范现在失败了。

此外,一般来说,我不希望您在创建记录时设置 ids。您很可能将它们设置为自动递增。


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

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