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 に答える