在函数内对 NodeJS Promise 进行单元测试

Unit testing NodeJS Promise inside a function

我正在尝试对调用 promise 的函数进行单元测试...

使用摩卡,诗乃。我有一个这样的功能块:

myfile.js:

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

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

在我的测试中,我使用 proxyquire 来模拟 outerdependecy

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);
       });

我的实际测试现在调用 main "testfunction"

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

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

我认为这可能是由于某种竞争条件导致的,在我的测试后承诺正在解决 运行... 无论如何要延迟测试直到我的承诺得到解决。

我知道在 angularjs 承诺测试中,有一种方法可以 "tick" 承诺,因此它会在您需要时解决。在 nodejs 中可能吗?

  • is there anyway to delay the test until my promise is resolve.

据我了解你的问题,是的,你应该只在 promise 解决后才调用 done() 。为此,您需要两件事:

1- 执行 TestFunctionreturn 一个 Promise,所以你可以等到它解决:

    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 块触发并且回调被触发),期望和完成的调用总是在回调被调用后触发

  • I see the stub being called (the console log, hence why i didnt want to use sinon.spy) but the spy is saying its not called. and unit test fails.

那是因为您的预期 运行 是在 TestFunction 调用之后立即发生的,而不是等待它稳定下来。但是,它 最近被调用,因此 console.log 出现在下一个规范中。