8

我有一个函数可以在最小值和最大值之间选择一个随机值。因此,当我进行测试时,我测试该值是否介于最小值和最大值之间。但是在我的应用程序中出现一些失败的地方,测试通过了一些时间,有时由于随机性而失败。

Math.random()覆盖/模拟以返回 0 和 1 并测试我的值是否与最大值或最小值相同是个好主意吗?还是有更好的方法来测试 JavaScript 中的随机性?

这是将用于创建随机数的函数:

function constrain(min, max){
    return Math.round(Math.random() * (max - min) + min)
}
4

3 回答 3

25

SinonJS是一个 JavaScript模拟框架,它集成了所有主要的 JavaScript 单元测试框架。适配器将负责“还原”您在测试期间创建的任何存根/模拟。

// Stub out Math.random so it always returns '4' (chosen by fair dice roll)
sinon.stub(Math, 'random').returns(4);

// Double check that it worked.
equal(Math.random(), 4, "http://xkcd.com/221/");
于 2012-05-09T12:45:46.593 回答
2

最好,您的测试中根本不应该有随机元素。您应该为您的方法提供已知值,以便您可以确定结果是否正是您所期望的。

如果您有随机值,您将不得不多次测试该方法,并且您仍然不确定您是否获得了您想要的确切结果,只是您得到了正确范围内的结果。

例如,如果您在代码中使用当前日期 ( new Date()),那么您应该在测试时为您的方法提供已知日期,否则您的测试将仅显示该方法现在有效。明天可能会失败。


编辑:

但是,我可以立即告诉您,您的方法效果不佳。您应该使用该floor方法而不是round,否则最低和最高值的出现频率将是其他值的一半:

function constrain(min, max){
  return Math.floor(Math.random() * (max - min + 1) + min)
}
于 2012-05-09T11:32:42.820 回答
1

通常,您的测试应该通过您的非确定性代码的所有可能值。也许在您的测试中有一个循环,您可以在其中进行 100 次测试。这将在不更改应用程序代码的情况下捕获更多故障。你的建议也是一种选择。

于 2012-05-09T11:23:03.817 回答