我正在尝试用 sinon 和 es2016 消除一个 super 调用,但我运气不佳。任何想法为什么这不起作用?
运行 Node 6.2.2,这可能是其类/构造函数实现的问题。
.babelrc 文件:
{
"presets": [
"es2016"
],
"plugins": [
"transform-es2015-modules-commonjs",
"transform-async-to-generator"
]
}
测试:
import sinon from 'sinon';
class Foo {
constructor(message) {
console.log(message)
}
}
class Bar extends Foo {
constructor() {
super('test');
}
}
describe('Example', () => {
it('should stub super.constructor call', () => {
sinon.stub(Foo.prototype, 'constructor');
new Bar();
sinon.assert.calledOnce(Foo.prototype.constructor);
});
});
结果:
test
AssertError: expected constructor to be called once but was called 0 times
at Object.fail (node_modules\sinon\lib\sinon\assert.js:110:29)
at failAssertion (node_modules\sinon\lib\sinon\assert.js:69:24)
at Object.assert.(anonymous function) [as calledOnce] (node_modules\sinon\lib\sinon\assert.js:94:21)
at Context.it (/test/classtest.spec.js:21:18)
注意:这个问题似乎只发生在构造函数中。我可以毫无问题地监视从父类继承的方法。
最佳答案
由于 JavaScript 实现继承的方式,您需要 setPrototypeOf 子类。
const sinon = require("sinon");
class Foo {
constructor(message) {
console.log(message);
}
}
class Bar extends Foo {
constructor() {
super('test');
}
}
describe('Example', () => {
it('should stub super.constructor call', () => {
const stub = sinon.stub().callsFake();
Object.setPrototypeOf(Bar, stub);
new Bar();
sinon.assert.calledOnce(stub);
});
});
关于javascript - ES2016 类,Sinon Stub 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271140/