SinonJSでMockに関するテストをかく

Mockとはテスト対象が依存しているオブジェクトの置き換えとして動作し、テスト対象が適切に動作しているかどうかをシミュレートするためのオブジェクトです。 以下の例はSinonJSの公式のページから引っ張ったものです。 内部でPubSubJsが利用されており、ここで書かれている2つのサブスクライバは、undefinedなPublishに対していずれも例外を投げる動作が期待されます。

"例外時にはすべてのサブスクライバーが呼ばれること": function () {
    var myAPI = { method: function () {} };

    var spy = sinon.spy();
    var mock = sinon.mock(myAPI);
    mock.expects("method").once().throws();

    PubSub.subscribe("message", myAPI.method);
    PubSub.subscribe("message", spy);
    PubSub.publishSync("message", undefined);

    mock.verify();
    assert(spy.calledOnce);
}

Spyではテスト対象のやり取りを記録し、実行後に期待した動作をするかどうかを検証します。

一方でMockは事前に期待する動作を定義し、実行後にVerifyで検証します。

どちらも同じように動いているように見えますが、Mockではオブジェクトそのもののとして振る舞う一方で、Spyを利用した場合においては大きなクラスの特定のメソッドの検証を行うことが出来ます。