我找不到对es5类对象方法进行存根的正确方法。如果我只能在调用new A()
时返回伪造的对象/类,那也会起作用。
我尝试过的
sinon.stub(A, 'hello').callsFake(() => console.log("stubbed"))
sinon.stub(A.prototype, 'hello').callsFake(() => console.log("stubbed"))
sinon.stub(A, 'constructor').callsFake(() => {hello: ()=>console.log("stubbed")})
function A () {
this.hello = function() {
console.log("hello");
}
}
new A().hello();
预期输出:已存根
当前输出:您好
答案 0 :(得分:0)
hello
是instance property ...
...因此,将创建一个新函数并将其添加为每个新实例的hello
属性。
因此,模拟它需要一个实例:
const sinon = require('sinon');
function A () {
this.hello = function() { // <= hello is an instance property
console.log("hello");
}
}
it('should stub hello', () => {
const a = new A(); // <= create an instance
sinon.stub(a, 'hello').callsFake(() => console.log("stubbed")); // <= stub the instance property
a.hello(); // <= logs 'stubbed'
});
如果将hello
更改为prototype method,则可以在所有实例中将其存根:
const sinon = require('sinon');
function A () {
}
A.prototype.hello = function() { // <= hello is a prototype method
console.log("hello");
}
it('should stub hello', () => {
sinon.stub(A.prototype, 'hello').callsFake(() => console.log("stubbed")); // <= stub the prototype method
new A().hello(); // <= logs 'stubbed'
});
请注意,原型方法与该ES6代码等效:
class A {
hello() {
console.log("hello");
}
}
...这似乎是您打算定义hello
的方式。