使用 FFaker::Internet.user_name 时指定最小长度

Specifying minimum length when using FFaker::Internet.user_name

我的规范一直失败,因为 FFaker::Internet。user_name 生成的单词少于 5 个字符。

如何在此 stmt 中指定最小长度:

username { FFaker::Internet.user_name }

你不能,但你可以 FFaker::Name.name.join,这会生成名字和中间名

据我所知,您尝试在您的工厂中使用 FFaker。当您可以定义 sequence

时,为什么要让您的规格过于复杂
sequence(:username) do |n|
   "username-#{n}"
end

但是这个问题是有效的,你可能有一些使用 ffaker 的合法需求,并且有很多方法可以做到这一点。您可以将用户名连接两次,为什么不呢?

username { FFaker.username + FFaker.username }

或者继续寻找长度最短的用户名:

username do
   do
     name = FFaker.username
   while name.length < 5
   name
end

或者monkeypatch ffaker自己实现https://github.com/ffaker/ffaker/blob/0578f7fd31c9b485e9c6fa15f25b3eca724790fe/lib/ffaker/internet.rb#L43 + https://github.com/ffaker/ffaker/blob/0578f7fd31c9b485e9c6fa15f25b3eca724790fe/lib/ffaker/name.rb#L75

例如

class FFaker
  def long_username(min_length = 5)
    fetch_sample(FIRST_NAMES.select {|name| name.length >= min_lenght })
  end
end

有很多方法可以实现这一点,但如果我必须这样做,我会做类似

的事情
(FFaker::Internet.user_name + '___')[0...5]
#=> "Lily_"

三个下划线是因为快速查找name list后,我发现名字的最小长度是两个字符,所以二加三总是至少五个字符。

我只使用五个字符的子字符串,以免尾随下划线,但这只是我个人的喜好,您可以使用用户名加三个下划线,您的测试用例就可以了。

您也可以使用 FFaker::String 使用正则表达式手动构建它,如下所示:

# 5 characters username, with first character being a letter
username { FFaker::String.from_regexp(/[a-zA-Z]\w{4}/) }

# random 5-10 characters username with first character being a letter
regex = Regexp.new("[a-zA-Z]\w{#{Random.rand(4..9)}}")
username { FFaker::String.from_regexp(regex) }

另一个想法是在末尾添加一些随机数。这对我有用,很容易实现,而且看起来很自然(因为人类在野外创建用户名时往往会这样做)。

例如这会将“1234”添加到用户名的末尾:

"steve" + "1234"

Faker:

Faker::Internet.unique.user_name + "1234"

注意:如果您想要一个随机字符串(而不是“1234”,请尝试一些 these 方法。但是,如果您已经在使用 Faker .unique,则可能没有必要方法如上例。

String#ljust — Returns 给定长度的 self 副本,right-padded 和给定的其他字符串。

username { FFaker::Internet.user_name.ljust(5,"12345") }