我正在使用 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.com
和 vtqCXuHCfITEUJB@example.com
)。
我发现伪随机生成器按顺序工作,这样当用相同的数字重新播种随机性时,它会再次执行相同的顺序。我不禁想知道 RSpec 是否在测试之间重新播种 Ruby 的随机性。 (也许值得注意的是,重用电子邮件地址的测试经常出现在不同的 RSpec 测试文件中;也许 RSpec 正在文件之间重新播种?)
有什么想法吗?
最佳答案
即使 RSpec 没有重新播种 RNG,其他东西也可能会破坏您的规范。通过将规范的行为与某些更大的系统状态联系起来,您正在使规范变得脆弱。
通常唯一的电子邮件地址只是按顺序生成的,或者使用类似 FactoryGirl 的东西或者只是在辅助方法中。如果您用完了这些,祝贺您自己编写了历史上最大的测试套件。
关于Ruby/RSpec 随机化似乎不是那么随机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24790483/