Sinon.jsを使ったモックとスタブ

  • はじめに 今回は、Sinon.jsを使って、JavaScriptアプリケーションのテストでモックスタブを実装する方法を学びましょう。Sinon.jsは、テストのためのスパイ、スタブ、モックを提供するライブラリです。それでは、二人の説明を見ていきましょう。
Gal Normal

Sinon.jsって何?

Geek Curious

テストのためにモックやスタブを作るライブラリだよね?

Gal Happy

そうなの!Sinon.jsは、テストのためにスパイ、スタブ、モックを簡単に作れるようにするライブラリなの!

Gal Pleased

まず、Sinon.jsをプロジェクトに追加するには、 npm install sinon でインストールするのよ!

npm install sinon
Geek Happy

なるほど、 npm install sinon でSinon.jsをインストールできるんだね!

Gal Happy

そうなの!それでは、スタブを使ってテストを書いてみましょう。

Gal Pleased

例えば、次のような関数があるとするね。

function fetchData(callback) {
  fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => callback(null, data))
    .catch(error => callback(error));
}
Geek Curious

この関数は、外部APIからデータを取得するんだね。

Gal Happy

そうなの!でも、テストのときには、外部APIに依存しないようにしたいの。だから、 fetch 関数をスタブに置き換えるの!

Gal Pleased

Sinon.jsを使って、 fetch 関数をスタブに置き換えるには、こんな感じに書くのよ!

const sinon = require('sinon');
const assert = require('assert');

describe('fetchData', () => {
  it('should call the callback with the fetched data', () => {
    const fetchStub = sinon.stub(global, 'fetch');
    const fakeData = { key: 'value' };
    fetchStub.resolves({
      json: () => Promise.resolve(fakeData),
    });

    const callback = sinon.spy();

    fetchData(callback);

    fetchStub.restore();

    assert(callback.calledWith(null, fakeData));
  });
});
Geek Happy

なるほど、 sinon.stub() を使って、 fetch 関数をスタブに置き換えて、テストが外部APIに依存しないようにするんだね!

Gal Happy

そうなの!Sinon.jsを使うことで、モックやスタブを簡単に作成して、テストが外部APIや他のコンポーネントに依存しないようにできるの!

Geek Curious

じゃあ、モックはどうやって使うの?

Gal Pleased

モックも簡単だよ!例えば、コールバック関数をモックに置き換えたい場合は、 sinon.mock() を使うの!こんな感じ!

const sinon = require('sinon');
const assert = require('assert');

describe('fetchData', () => {
  it('should call the callback with the fetched data', () => {
    const fetchStub = sinon.stub(global, 'fetch');
    const fakeData = { key: 'value' };
    fetchStub.resolves({
      json: () => Promise.resolve(fakeData),
    });

    const callback = sinon.mock()
      .once()
      .withArgs(null, fakeData);

    fetchData(callback);

    fetchStub.restore();

    callback.verify();
  });
});
Geek Happy

なるほど、 sinon.mock() を使って、コールバック関数をモックに置き換えて、テストを書くんだね!

Gal Happy

そうなの!モックとスタブを使うことで、テストが他のコンポーネントや外部サービスに依存しないようにできるから、テストがより安定するの!

  • おわりに Sinon.jsを使って、JavaScriptアプリケーションのテストでモックとスタブを実装する方法を学びました。これにより、テストが他のコンポーネントや外部サービスに依存しないようにでき、テストがより安定するようになります!👍