【问题标题】:How to sinon stub a call to external module in a tested function如何在测试函数中存根对外部模块的调用
【发布时间】:2016-03-29 23:05:36
【问题描述】:

我正在测试一个函数。该函数调用了一个外部模块,这使我的测试失败:

element.funcCall();

函数如下所示:

function funcCall() {
    external.a.b.c.doSomething();
}

它失败了:未定义不是一个对象(评估'external.a.b.c.doSomething')

我怎样才能存根或伪造这个,所以电话不是真的。我不需要它的功能来进行这个测试。

【问题讨论】:

    标签: javascript unit-testing sinon


    【解决方案1】:

    我是这样做的:

    var element  = require('element'),
        external = require('external'),
        sinon    = require('sinon'),
        expect   = require('chai').expect;
    
    describe('element.funcCall()', function() {
    
        before(function() {
            this.doSomethingStub = sinon.stub(external.a.b.c, 'doSomething');
        });
    
        it('should do something external', function() {
            element.funcCall();
            expect(this.doSomethingStub.called).to.be.true;
        });
    
        after(function() {
            this.doSomethingStub.restore();
        });
    
    });
    

    【讨论】:

    • 尝试过,但一直收到同样的错误。我最终以不同的方式解决了它。
    【解决方案2】:

    这就是我最终解决这个问题的方法。由于我不关心正在执行的外部函数,所以我像这样伪造它:

    var func = function() {};
    external = 
       { a: 
          { b: 
             { c: 
                {doSomething: func}
              }
           }
       }
    
    ...
    element.funcCall();
    expect.....
    

    这是内部函数调用被重定向到一个空函数,我可以测试该方法的其余部分

    【讨论】:

    • 我可以为那个假调用和测试用例提供一个实现
    猜你喜欢
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2011-10-23
    • 2011-10-08
    • 1970-01-01
    • 2016-05-11
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多