Nightwatch におけるテストダブル
テストダブル(モック、スタブ、フェイクとも呼ばれる)は、テストにおいて実際の依存関係をシミュレートされたものと置き換えることで、テスト対象のコードを分離するために使用されます。Nightwatch は、スタブとモックを依存関係に対して作成できる mock コマンドを通じて、テストダブルをサポートしています。
インストール
1) NPM からプラグインをインストールする
npm i @nightwatch/testdoubles --save-dev
2) 設定を追加する
nightwatch.json
(またはnightwatch.conf.js
)ファイルを開き、以下を追加します。
module.exports = {
plugins: ['@nightwatch/testdoubles']
// other Nightwatch settings...
}
3) ブラウザセッションを無効化する
ユニットテストのみを行うため、ブラウザセッションをオフにする必要があります。これは、これらのプロパティを設定することで実現できます。
module.exports = {
// ....
testdoubles: {
start_session: false,
webdriver: {
start_process: false,
}
}
}
Nightwatch 2.6.4 以降が必要です。
使用方法
@nightwatch/testdoubles
がインストールされ、設定ファイルに追加されると、テストケースで sinon オブジェクトを使用してテストダブルを作成できます。いくつかの例を以下に示します。
スパイ
スパイとは、呼び出し回数、呼び出し時の引数など、その呼び出しに関するメタデータを記録する関数です。スパイは、関数が呼び出されたことを確認したり、呼び出し時の引数を検査したりするのに役立ちます。
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回呼び出されたかどうかを確認します。最後に、スパイは元の状態に復元されます。
スタブ
スタブとは、元の関数を「ダミー」の実装で置き換える関数です。これは、テスト中に関数の動作を制御する必要がある場合(たとえば、エラー状態をシミュレートする場合)に役立ちます。
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() はチェックを実行し、チェックに失敗した場合はエラーを報告します。
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_session
と webdriver -> start_process
が false
に設定されているenvironment
に対して実行してください。
npx nightwatch <path to tests> --env testdoubles
これらの例が、Nightwatch テストで@nightwatch/testdoubles
の使用を開始するのに役立つことを願っています!