Ruby / RSpec随机化似乎不是随机的

时间:2014-07-16 20:52:05

标签: ruby rspec

我正在使用RSpec来测试我的网站。我有一种方法可以生成随机电子邮件地址,供用户注册:

def random_email
  alphabet = [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
  (0...15).map{ alphabet[rand(alphabet.length)] }.join << "@example.com"
end

在整个测试套件中多次调用此方法。很多时候,它最终生成A)多个相同的电子邮件地址(实际示例:tqCXuHCfITEUJBh@example.com)或B)电子邮件地址,这些地址会在以前使用的电子邮件地址的开头添加一些新字符,并切断一些最后(实际示例:tqCXuHCfITEUJBh@example.comvtqCXuHCfITEUJB@example.com)。

我发现伪随机生成器按顺序工作,这样当随机性重新播种相同的数字时,它将再次执行相同的序列。我不禁想知道RSpec是否正在重新播种Ruby在测试之间的随机性。 (也许值得注意的是,重用电子邮件地址的测试经常发生在不同的RSpec测试文件中;也许RSpec会在文件之间重新播种?)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

即使RSpec没有重新播种RNG,也可能有其他东西,它会打破你的规格。你通过将他们的行为与更大的系统状态联系起来,使你的规范变得脆弱。

通常,唯一的电子邮件地址是按顺序生成的,可以使用FactoryGirl之类的东西,也可以只使用辅助方法。如果你没有这些,请祝贺你自己编写历史上最大的测试套件。

相关问题