コンストラクターをsinonでモックしてスタブ化する
私は2つの解決策を示します。1つ目は、コンストラクターを動作でモックする方法という質問に対処し、2つ目は、ダミーでコンストラクターをスタブ化する方法を示しています。グーグルはそれをスタブする方法を検索するためにこの質問に何度も私を導きました。
コンストラクターを動作でモックする
これが最短経路かどうかはわかりません。少なくとも、求められていたものはそうです。
まず、sinonのfake
メソッドを使用して、必要な動作をするモックコンストラクターを作成しますMock
。次に、メソッドを1つずつ追加する必要があります。調査しなかった理由により、のプロトタイプ全体をに設定すると、機能しませんでしUnderTest
たMock
。
require('chai').should();
const { fake} = require('sinon');
class UnderTest {
constructor() {
this.mocked = false;
}
isMocked() {
return this.mocked;
}
}
describe('UnderTest', () => {
let underTest;
let isMocked;
before(() => {
const Mock = fake(function () { this.mocked = true; });
Mock.prototype.isMocked = UnderTest.prototype.isMocked;
underTest = new Mock();
isMocked = underTest.isMocked();
});
it('should be mocked', () => {
isMocked.should.be.true;
});
});
コンストラクターをダミーでスタブする
この投稿に誘導された場合は、コンストラクターをスタブして実行されないようにする必要があるためです。
Sinon'screateStubInstance
はスタブコンストラクターを作成します。また、すべてのメソッドをスタブします。したがって、テスト中のメソッドは前に復元する必要があります。
require('chai').should();
const { createStubInstance } = require('sinon');
class UnderTest {
constructor() {
throw new Error('must not be called');
}
testThis() {
this.stubThis();
return true;
}
stubThis() {
throw new Error('must not be called');
}
}
describe('UnderTest', () => {
describe('.testThis()', () => {
describe('when not stubbed', () => {
let underTest;
let result;
before(() => {
underTest = createStubInstance(UnderTest);
underTest.testThis.restore();
result = underTest.testThis();
});
it('should return true', () => {
result.should.be.true;
});
it('should call stubThis()', () => {
underTest.stubThis.calledOnce.should.be.true;
});
});
});
});