unit testingNodeJS Promise里面的一个函数

我试图unit testing一个函数,调用承诺…

使用摩卡,Sinon。 我有这样的function块:

myfile.js:

let OuterDependecy = require('mydep'); function TestFunction(callback) { OuterDependency.PromiseFunction().then(response => { //some logic here }).catch(err => {callback(err)}); 

在我的testing里面,我使用了一些代用品来嘲弄外在的东西

testfile.js

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

然后在我的testing块内

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

我的实际testing现在称为主要的“testingfunction”

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

我看到存根被调用(控制台日志,因此为什么我不想使用sinon.spy),但间谍说它没有被调用。 unit testing失败。

我相信这可能是由于我的testing运行后的承诺正在解决的种族情况…是否有延迟testing,直到我的承诺解决。

我知道在承诺testing中,有一种方法可以“打勾”承诺,以便在您想要的时候解决。 可能在nodejs?

  • 是否有延迟testing,直到我的承诺解决。

据我了解你的问题,是的,你应该只在done() 承诺后打电话给done() 。 为了做到这一点,你需要两件事情:

1-强制TestFunction 返回一个Promise,所以你可以等到它解决:

  function TestFunction(callback) { return OuterDependency.PromiseFunction().then(response => { //some logic here }).catch(err => { callback(err) }); } 

等待这个承诺解决,然后通话done

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

现在,我们的块将不会运行,直到TestFunctioncatch块,所以如果testing按预期工作(即catch块触发,callback被触发), 期望和完成的调用总是在调用callback后触发

  • 我看到存根被调用(控制台日志,因此为什么我不想使用sinon.spy),但间谍说它没有被调用。 unit testing失败。

那是因为你的期望在TestFunction调用之后运行,而不是等待它解决。 但是,它被最近调用,因此console.log出现在下一个规范中。