函数不能用Mocha / Sinon模拟/存根

时间:2015-07-27 08:37:02

标签: javascript unit-testing 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'));

有人可以帮我弄清楚我的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

问题是您在A正文中对B的引用是直接引用原始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);