テストダブル(モック、スタブ、フェイクとも呼ばれる)は、テストにおいて実際の依存関係をシミュレートされたものと置き換えることで、テスト対象のコードを分離するために使用されます。Nightwatch は、スタブとモックを依存関係に対して作成できる mock コマンドを通じて、テストダブルをサポートしています。

インストール

1) NPM からプラグインをインストールする
npm i @nightwatch/testdoubles --save-dev
2) 設定を追加する

nightwatch.json(またはnightwatch.conf.js)ファイルを開き、以下を追加します。

nightwatch.conf.js
module.exports = {
  plugins: ['@nightwatch/testdoubles']

  // other Nightwatch settings...
}
3) ブラウザセッションを無効化する

ユニットテストのみを行うため、ブラウザセッションをオフにする必要があります。これは、これらのプロパティを設定することで実現できます。

nightwatch.conf.js
module.exports = {
  // ....
  testdoubles: {
    start_session: false,
    webdriver: {
      start_process: false,
    }
  }
}

Nightwatch 2.6.4 以降が必要です。

使用方法

@nightwatch/testdoubles がインストールされ、設定ファイルに追加されると、テストケースで sinon オブジェクトを使用してテストダブルを作成できます。いくつかの例を以下に示します。

スパイ

スパイとは、呼び出し回数、呼び出し時の引数など、その呼び出しに関するメタデータを記録する関数です。スパイは、関数が呼び出されたことを確認したり、呼び出し時の引数を検査したりするのに役立ちます。

spy.js

describe('use spies in nightwatch', function() {
  it('should log message when called', function({sinon}) {
    const obj = {
      hello: () => console.log('Hello!')
    }
    const sayHello = () => obj.hello(); 
    const spy = sinon.spy(obj, 'hello'); // create a spy on hello
    sayHello();
    assert(spy.calledOnce);  // assert that the spy was called once
    spy.restore();  // restore original hello function
  })
})

この例では、オブジェクトの hello メソッドにスパイを作成し、sayHello 関数を呼び出します。アサーションは、スパイが1回呼び出されたかどうかを確認します。最後に、スパイは元の状態に復元されます。

スタブ

スタブとは、元の関数を「ダミー」の実装で置き換える関数です。これは、テスト中に関数の動作を制御する必要がある場合(たとえば、エラー状態をシミュレートする場合)に役立ちます。

stub.js
describe('use stubs in nightwatch', function() {
  it('stub hello', function({sinon}) {
    const obj = {
      hello: () => console.log('Hello!')
    }
    const sayHello = () => obj.hello();
    const stub = sinon.stub(obj, 'hello').returns('hi'); // replace hello with a dummy implementation that returns 'hi'
    const result = sayHello();
    assert.strictEqual(result, 'hi'); // check that the stubbed function returned 'hi'
  });
});

この例では、console.log メソッドにスタブを作成し、引数 'Hello!' で呼び出します。アサーションは、スタブが期待される引数で1回呼び出されたかどうかを確認します。最後に、スタブは元の状態に復元されます。

モック

モックとは、オブジェクトを「模倣」する関数です。つまり、実際のオブジェクトと同じインターフェースを持つ、偽のオブジェクトを作成します。モックオブジェクトに期待値を設定できます(つまり、どのメソッドを呼び出し、どのような引数で呼び出すかを指定します)。モックは、テスト中にこれらの期待値が満たされていることを確認します。

モックの作成は自動的に Nightwatch アサーションをアタッチします。mock.verify() はチェックを実行し、チェックに失敗した場合はエラーを報告します。

mock.js

describe('use mocks in nightwatch', function() {
  it('mock hello obj', function({sinon}) {
    const obj = {
      hello: () => console.log('Hello!')
    }
    const sayHello = () => obj.hello();
    const mock = sinon.mock(obj).expects('hello').atLeast(1).returns(null); //set a mock on hello
    sayHello();
    mock.verify(); // mocks comes with inbuilt assertion 
  })
})

この例では、オブジェクトの hello メソッドにモックを作成し、sayHello 関数を呼び出します。mock.verify() メソッドは、モックが少なくとも1回呼び出されたかどうかを確認します。最後に、モックは元の状態に復元されます。

スパイ、スタブ、モックの使用方法の詳細については、Sinon.js ドキュメントを参照してください。

API テストの実行

API テストは、start_sessionwebdriver -> start_processfalse に設定されているenvironmentに対して実行してください。

npx nightwatch <path to tests> --env testdoubles

これらの例が、Nightwatch テストで@nightwatch/testdoubles の使用を開始するのに役立つことを願っています!