单元测试函数

时间:2017-11-29 13:52:27

标签: javascript node.js unit-testing mocha

我试图对一个调用承诺的函数进行单元测试......

使用Mocha,Sinon。我有一个像这样的功能块:

myfile.js:

    let OuterDependecy = require('mydep');
    function TestFunction(callback) {
        OuterDependency.PromiseFunction().then(response => {  

       //some logic here
     }).catch(err => {callback(err)});

在我的测试中,我使用proxyquire来模拟外部依赖性

testfile.js

let proxyquire = require('proxyquire');
let OuterDepStub = {};
let testingFunc = proxyquire('myfile.js', {'mydep': OuterDepStub});

...然后在我的测试块中

    let stubCallback = function() {
                console.log('Stub dubadub dub'); //note...i can use sinon.spy here instead
    };

   beforeEach(()=>{
            OuterDependency.PromiseFunction = function(arg) {
               return  new Promise((resolve, reject)=>{
                   reject('BAD');
               });
            };


            spy = sinon.spy(stubCallback);
       });

我的实际测试现在调用主要的“testfunction”

it('Catches Errors, and calls back using error', done => {
            TestFunction(stubCallback);
            expect(spy).to.have.been.called;
            done();
        });

我看到被调用的存根(控制台日志,因此我不想使用sinon.spy),但是间谍说它没有被调用。单元测试失败。

我认为这可能是由于竞争条件导致我的测试结束后承诺得到解决...无论如何都要推迟测试,直到我的承诺得到解决。

我知道在angularjs承诺测试中,有一种方法可以“勾选”这个承诺,以便它可以在你想要的时候解决。在nodejs中可能吗?

1 个答案:

答案 0 :(得分:1)

  •   

    无论如何都要推迟测试,直到我的承诺得到解决。

据我了解您的问题,是的,您只应在承诺解决后致电done() 。为此,您需要做两件事:

1-强制TestFunction 返回承诺,以便您可以等到结算:

    function TestFunction(callback) {
     return OuterDependency.PromiseFunction().then(response => {

        //some logic here
    }).catch(err => { callback(err) });
}

2-等待该承诺解决,然后致电done

it('Catches Errors, and calls back using error', done => {
    TestFunction(stubCallback).then(() => {
        expect(spy).to.have.been.called;
        done();
    })
});

现在,我们的then块在catch内的TestFunction块之前不会运行,所以如果测试按预期工作(即catch块触发并且回调被触发) ,在调用回调后,期望和完成的调用将始终触发

  •   

    我看到被调用的存根(控制台日志,因此我不想使用sinon.spy),但是间谍说它没有被调用。单元测试失败。

这是因为你的期望在TestFunction电话之后立即运行,而不是等待它解决。但是, 最近会被调用,因此console.log会显示在下一个规范中。