【发布时间】:2018-06-27 20:43:14
【问题描述】:
我的规范一直失败,因为 Ffaker::Internet.user_name 生成的单词少于 5 个字符。
如何在这个 stmt 中指定最小长度:
username { FFaker::Internet.user_name }
【问题讨论】:
标签: ruby-on-rails ruby rspec rspec-rails
我的规范一直失败,因为 Ffaker::Internet.user_name 生成的单词少于 5 个字符。
如何在这个 stmt 中指定最小长度:
username { FFaker::Internet.user_name }
【问题讨论】:
标签: ruby-on-rails ruby rspec rspec-rails
据我所知,您尝试在工厂中使用 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 后,我发现名字的最小长度是两个字符,所以二加三总是至少五个字符。
我只使用五个字符的子字符串,以便不总是有尾随下划线,但这只是我个人的喜好,你可以使用用户名加上三个下划线,你的测试用例就可以了。
【讨论】:
String#ljust — 返回给定长度的 self 的副本,右填充给定的其他字符串。
username { FFaker::Internet.user_name.ljust(5,"12345") }
【讨论】:
你不能,但你可以做 FFaker::Name.name.join,这会生成名字和中间名
【讨论】:
您也可以使用 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 方法,则可能没有必要.
【讨论】: