用 sinon 模拟和存根构造函数
我给出两个解决方案。第一个解决了这个问题,如何用行为来模拟构造函数,第二个展示了如何用一个假人来存根它。谷歌多次引导我回答这个问题,以搜索如何存根。
用行为模拟构造函数
我不知道这是否是最短路径。至少它确实如此,所要求的。
首先,我使用 sinon 的fake
方法来创建一个Mock
具有我想要的行为的模拟构造函数。然后我必须一一添加方法。由于我没有调查的原因,在将整个原型设置为UnderTest
to时它不起作用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;
});
});
用假人存根构造函数
如果你被引导到这篇文章,因为你只想存根构造函数以防止它被执行。
SinoncreateStubInstance
创建了一个存根构造函数。它还存根所有方法。因此,被测方法必须先恢复。
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;
});
});
});
});