如何使用Factory Girl创建不包含数字的唯一字符串?

17

也许需要一个外部的宝石才能生成随机且独特的用户名吗?

这是我目前的工厂:

factory :user_4 do
    sequence(:id) { |n| n }
    sequence(:first_name) { |n| "Gemini" + n.to_s }
    sequence(:last_name) { |n| "Pollux" + n.to_s }
    sequence(:profile_name) { |n| "GeminiPollux" + n.to_s  }
    sequence(:email) { |n| "geminipollus" + n.to_s + "@hotmail.co.uk" }
end

使用序列方法可以处理id、profile_name和email,但是我的正则表达式验证意味着名字中的名和姓不合法,因为它们包含数字。这与唯一性无关。

那么我应该如何创建这些唯一的名称?

4个回答

21
factory :user_4 do
  # ...
  sequence(:first_name, 'a') { |n| "Gemini" + n }
  sequence(:last_name, 'a') { |n| "Pollux" + n }
  # ...
end

FactoryGirl的#sequence方法接受第二个参数作为其起始值。这可以是字符串、整数,或者其他支持通过#next方法递增的类型。

如果起始值为'a',则序列将为a, b, c ... z, aa, ab, ac ...


2
最佳答案!您还可以使用“ A”,它将执行“A,B ... Z,AA,AB ...”。 - Ryan Taylor

20

生成随机字符串的方法有无限可能,不需要依赖第三方gem包。

以下是其中之一。

('a'..'z').to_a.shuffle.join
# => "sugrjtyoiqlbxkzcfnawdhpevm"

例子

factory :user_4 do
  sequence(:id) { |n| n }
  first_name { "Gemini" + random_name }
  # ...
end

def random_name
  ('a'..'z').to_a.shuffle.join
end

如果随机因素过低,您可以增加复杂度。


这个答案对我非常有帮助,但是一个不太直观的信息是,方法定义不仅必须在工厂声明之外,而且还必须在FactoryGirl.define do块之外。 - MageeWorld

2
factory :user_4 do
  letters = [a,b,c,d]
  sequence(:id) { |n| n }
  sequence(:first_name) { |n| "Gemini" + letters[n] }
  sequence(:last_name) { |n| "Pollux" + letters[n] }
  sequence(:profile_name) { |n| "GeminiPollux" + letters[n]  }
  sequence(:email) { |n| "geminipollus" + letters[n] + "@hotmail.co.uk" }
end

或者简单地使用ASCII转换,或者使用Faker gem。


0
如果你只给sequence一个值,FactoryBot会自动生成一系列的值,通过对该值应用#next方法。由于Ruby的String类准备了#next方法,它返回一个字符串的后继,因此你可以像下面这样写:
factory :user_4 do
    sequence(:id) { |n| n }
    sequence(:first_name) { "Gemini" }
    sequence(:last_name) { "Pollux" }
    profile_name { "#{first_name} #{last_name}" }
    email { "#{first_name.downcase}#{last_name.downcase}@hotmail.co.uk" }
end

例如,一个 first_name 的序列是 "Gemini"、"Geminj"、"Gemink" 等等。
参考资料。

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