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

时间:2018-06-27 20:43:15

标签: ruby-on-rails ruby rspec rspec-rails

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

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

username { FFaker::Internet.user_name }

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

据我所见,您尝试在工厂中使用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骗子,自己实施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

答案 2 :(得分:0)

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

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

有3个下划线,是因为在快速查找name list之后,我发现名字的最小长度为2个字符,因此2加3始终至少为5个字符。

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

答案 3 :(得分:0)

您还可以使用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) }