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

标签 javascript node.js unit-testing mocha.js

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

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

我的文件.js:

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

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

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

测试文件.js

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

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

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

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

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

我知道在 angularjs promise 测试中,有一种方法可以“勾选” promise ,以便在您需要时解决。可能在 nodejs 中?

最佳答案

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

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

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

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

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

2- 等待 promise 完成,然后调用done

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

现在,我们的 then block 直到 TestFunction 中的 catch block 才会运行,所以如果测试按预期工作(即catch block 触发并触发回调),期望和完成的调用将始终在回调被调用后触发

  • 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 出现在下一个规范中。

关于javascript - 在函数内对 NodeJS Promise 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47554438/

相关文章:

javascript - 如何在 Node.js 中转义双引号

javascript - 如何在node.js中强制调用同步

python - Django 单元测试和模拟请求模块

visual-studio - 使用自定义程序集基目录从命令行运行 MsTest

c++ - "Echo"单元测试设备

javascript - 使用 getJSON 获取 json 数据

javascript - 无法在 JS 中导入自定义创建的类

node.js - 在 Node.js 中执行 bash 命令并获取退出代码

javascript - 使用d3的csv中的列总和

javascript - 向上/向下移动选项列表框 JavaScript/ASP