gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:03:53 28 4
gpt4 key购买 nike

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

但是,我认为我有可能需要这样做的情况。我正在处理的代码有一些非 AR 模型。例如,用户模型不受数据库表支持,因为我们通过 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_id1以及。这使得数据在不应该关联的时候看起来是关联的,这是某些规范间歇性失败的根本原因 - 数据在不应该关联的时候看起来是关联的(因为无意中对齐了 FK)。

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

所以,这就是为什么我要执行以下操作:

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

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

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

最佳答案

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

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


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

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

关于ruby-on-rails - 当 FK 关联对象不是 AR 关系时,可以在 FactoryBot 定义中使用随机 FK ID 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49565228/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com