旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

Math.randomをmockするlaplaceモジュール

2013年8月11日

テスト時に Math.random() の乱数を固定するための npm パッケージです。
0.0 以上 1.0 未満を指定した回数で割って、順番に出力するようにします。

GitHub – npm-laplace

例えばこんな風に使います。
今のところは 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 になってしまいました。

こういうのって、どーすればいいんでしょうか?

というか、ちゃんとしたライブラリがあれば是非教えて下さい・・・。