Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 当FK关联对象不是AR关系时,确定在FactoryBot定义中使用随机FK ID吗?_Ruby On Rails_Ruby_Testing_Rspec_Factory Bot - Fatal编程技术网

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

Ruby on rails 当FK关联对象不是AR关系时,确定在FactoryBot定义中使用随机FK ID吗?,ruby-on-rails,ruby,testing,rspec,factory-bot,Ruby On Rails,Ruby,Testing,Rspec,Factory Bot,我经常听说在编写测试时不要使用随机数据,这对于大多数数据来说似乎是合理的 然而,我认为我有一个可能是必要的情况。我正在研究的代码有一些非AR模型。例如,用户模型不受DB表的支持,因为我们通过API将这些记录拉入 其他AR支持的模型通过FKs与非AR用户模型“关联”,但它们不是AR关联。因此,我不能在FactoryBot中与owner建立隐式关联,我必须手动设置owner\u id属性 这目前是通过序列(:owner\u id)完成的,就像这样 FactoryGirl.define do fa

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

然而,我认为我有一个可能是必要的情况。我正在研究的代码有一些非AR模型。例如,用户模型不受DB表的支持,因为我们通过API将这些记录拉入

其他AR支持的模型通过FKs与非AR用户模型“关联”,但它们不是AR关联。因此,我不能在FactoryBot中与
owner
建立隐式关联,我必须手动设置
owner\u id
属性

这目前是通过
序列(:owner\u id)
完成的,就像这样

FactoryGirl.define do
  factory :dog do
    sequence(:owner_id)
    name "Sparky"
    legs 4
   end
  end
end
问题是,由于多个工厂使用序列手动设置
owner\u id
FK,但FactoryBot不知道它们引用的是同一个模型,因此序列不会依次递增

因此,当上述
dog
工厂
用户id
1
且另一家工厂也将
用户id
设置为
1
时,存在间歇性规范。这使得数据在不应的情况下看起来是关联的,这是某些规范间歇性失败的根本原因-数据在不应关联的情况下看起来是关联的(因为无意中对齐了FK)

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

所以,这就是我想做以下工作的原因:

FactoryGirl.define do
  factory :dog do
    owner_id { rand(1_000_000) }
    name "Sparky"
    legs 4
   end
  end
end
我知道这并不能确保唯一性,但我确实认为这会使偶尔失败的间歇性规范现在基本上消失


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

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

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


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

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

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

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


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

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

FactoryGirl/FactoryBot将在您创建新对象时为您生成一个id。我根本不会指定任何id。只需让数据库为您处理它。这也是在生产中创建对象最接近的近似值。因为,
rand(100_000)
并不保证每次都是唯一的。大多数情况下,但并非总是如此。ID应该始终是唯一的。将其处理留给数据库。FactoryGirl/FactoryBot将在创建新对象时为您生成ID。我根本不会指定任何ID。只需让数据库为您处理它。这也是最接近的方法在生产中创建对象的最大化。因为,
rand(100_000)
不能保证每次都是唯一的。大多数情况下,但不总是。ID应该总是唯一的。将其处理留给数据库。不稳定的规格是最差的:/time-based规格,每月/年(或在一天中的特定时间)仅中断一次第二个最差的地方是:“SergioTulentsev,从技术上讲,我也认为基于时间的折断也有一定的局限性。它们的确是这样,但在我们可以合理地猜测随机故障的起源的情况下,它们没有那么糟糕。有时:):鳞片规格是最坏的:/基于时间的规格,只在一个月/年(或在一天的特定时间)中断一次。第二个最差的地方是:“SergioTulentsev,从技术上讲,我也考虑了基于时间片断的规范。它们的确是,但是在我们可以合理地猜测随机故障的起源的意义上,它们没有那么差。有时……)