Math.randomをmockするlaplaceモジュール
2013年8月11日
テスト時に Math.random() の乱数を固定するための npm パッケージです。
0.0 以上 1.0 未満を指定した回数で割って、順番に出力するようにします。
0.0 以上 1.0 未満を指定した回数で割って、順番に出力するようにします。
例えばこんな風に使います。
今のところは Sinon.js と一緒に使うことを想定しています。
var mock = laplace.createMock(100);
var stub = sinon.stub(Math, "random", mock);
for (var i = 0; i < 100; i += 1) {
console.log(Math.random()); // 約 0, 約 0.01, 約 0.02, .. , 約 0.99
}
stub.restore();
注意点として、それぞれの値は === では判定できません。
保証しているのは、値の範囲でしかありません。
例えば、上記の例なら、
それぞれの値は以下の範囲に収まる、ということのみを保証しています。
[
0 以上 0.01 未満,
0.01 以上 0.02 未満,
// (..略..)
0.98 以上 0.99 未満,
0.99 以上 1.0 未満
]
できることは、これだけです。
Sinon.js用のヘルパー関数的な。
蛇足: 値が「以上」になるためにはどうすれば?
この辺のコードを見てもらうとわかるんですが、n を m で割った時の値を確実に「以上」にするために、小さな数を足してます。ひどい処理ですね!
これは、モックで置換した後に Underscore.js の _.random が、
このような処理をしないとちゃんと動かなかったため行いました。
具体的には、100 回で割った時に、26, 27, 28, 28, 30 になってしまいました。
こういうのって、どーすればいいんでしょうか?
というか、ちゃんとしたライブラリがあれば是非教えて下さい・・・。