函数不能 mocked/stub 和 Mocha/Sinon
Function can not be mocked/stub with Mocha/Sinon
我想在下面的代码中测试函数 B
以捕获函数 A
和 Mocha/Sinon
抛出的异常。
MyModule.js
(function(handler) {
// export methods
handler.B = B;
handler.A = A;
function A() {
// the third party API is called here
// some exception may be thrown from it
console.log('function A is invoked...');
}
function B() {
console.log('function B is invoked...');
try {
A();
} catch (err) {
console.log('Exception is ' + err);
}
}
})(module.exports);
但是,函数 A
似乎不能用以下代码模拟,因为原始函数 A
仍然在这里被调用。
var myModule = require('MyModule.js');
var _A;
it('should catach exception of function A', function(done) {
_A = sinon.stub(myModule, 'A', function() {
throw new Error('for test');
});
myModule.B();
_A.restore();
done();
});
此外,它不适用于 stub
_A = sinon.stub(myModule, 'A');
_A.onCall(0).throws(new Error('for test'));
有人可以帮我找出我的代码有什么问题吗?
问题是您在 B
正文中对 A
的引用是直接引用原始 A
。如果您改为引用 this.A
,它应该调用包装 A
.
的存根
(function(handler) {
// export methods
handler.B = B;
handler.A = A;
function A() {
// the third party API is called here
// some exception may be thrown from it
console.log('function A is invoked...');
}
function B() {
console.log('function B is invoked...');
try {
// This is referencing `function A() {}`, change it to `this.A();`
A();
} catch (err) {
console.log('Exception is ' + err);
}
}
})(module.exports);
我想在下面的代码中测试函数 B
以捕获函数 A
和 Mocha/Sinon
抛出的异常。
MyModule.js
(function(handler) {
// export methods
handler.B = B;
handler.A = A;
function A() {
// the third party API is called here
// some exception may be thrown from it
console.log('function A is invoked...');
}
function B() {
console.log('function B is invoked...');
try {
A();
} catch (err) {
console.log('Exception is ' + err);
}
}
})(module.exports);
但是,函数 A
似乎不能用以下代码模拟,因为原始函数 A
仍然在这里被调用。
var myModule = require('MyModule.js');
var _A;
it('should catach exception of function A', function(done) {
_A = sinon.stub(myModule, 'A', function() {
throw new Error('for test');
});
myModule.B();
_A.restore();
done();
});
此外,它不适用于 stub
_A = sinon.stub(myModule, 'A');
_A.onCall(0).throws(new Error('for test'));
有人可以帮我找出我的代码有什么问题吗?
问题是您在 B
正文中对 A
的引用是直接引用原始 A
。如果您改为引用 this.A
,它应该调用包装 A
.
(function(handler) {
// export methods
handler.B = B;
handler.A = A;
function A() {
// the third party API is called here
// some exception may be thrown from it
console.log('function A is invoked...');
}
function B() {
console.log('function B is invoked...');
try {
// This is referencing `function A() {}`, change it to `this.A();`
A();
} catch (err) {
console.log('Exception is ' + err);
}
}
})(module.exports);