【问题标题】:Ruby/RSpec randomization seems not-so-randomRuby/RSpec 随机化似乎不那么随机
【发布时间】:2014-07-17 10:12:42
【问题描述】:

我正在使用 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 在文件之间重新播种?)

有什么想法吗?

【问题讨论】:

  • 你的代码可以简化为def random_email; alphabet = [*'a'..'z', *'A'..'Z']; alphabet.sample(15).join &lt;&lt; "@example.com" end

标签: ruby rspec


【解决方案1】:

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

通常,唯一的电子邮件地址只是按顺序生成的,要么使用FactoryGirl 之类的东西,要么只是在帮助方法中。如果你用完了这些,恭喜你自己编写了历史上最大的测试套件。

【讨论】:

  • 我实际上正在测试一个 Drupal 站点,每次测试后进行清理需要大量代码手动清理订单表、订单项表、用户表等中的数据. 所以我会尝试使用 FactoryGirl 来获取连续的电子邮件地址,看看是否可行。谢谢!
  • 效果很好,谢谢!我的解决方案(将序列位置添加到 RSpec 种子):FactoryGirl.define { sequence :email { |n| prng = Random.new(RSpec.configuration.seed + n); alphabet = [*'a'..'z', *'A'..'Z']; alphabet.sample(15, random: prng).join &lt;&lt; '@example.com'; } }
猜你喜欢
  • 1970-01-01
  • 2012-04-24
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2014-02-02
  • 1970-01-01
  • 2011-05-01
相关资源
最近更新 更多