使用Factory Girl创建具有唯一属性的实例

7

我在guid字段上设置了一个限制和验证,以确保每个guid都是唯一的。问题是,在下面的工厂定义中,我只能创建一个用户实例,因为其他实例无法通过验证。

我该如何正确地做到这一点,以便guid字段始终是唯一的?

Factory.define(:user) do |u|
  u.guid UUIDTools::UUID.timestamp_create.to_s
end
1个回答

11

通常,Factory Girl 解决了序列的问题:

Factory.define(:user) do |u|
  u.sequence(:guid) { |n| "key_#{n}" }
end

我假设你并不想要一个类似迭代器的东西,而是想要一个时间戳。可以使用惰性属性(运行时计算)来实现:

Factory.define(:user) do |u|
  u.guid { Time.now.to_s }
end

或者,假设UUIDTools::UUID.timestamp_create生成了一个(希望格式合适的)时间戳:

Factory.define(:user) do |u|
  u.guid { UUIDTools::UUID.timestamp_create.to_s }
end

2
+1 OP遇到问题的原因是GUID创建代码在工厂定义时被评估,因此对于工厂的每次调用,该值都是恒定的。你提出的三种可能的解决方案中,第三种方案将在工厂的每次调用上生成一个新的GUID,这几乎肯定是OP所寻找的。 - Steve Weet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接