gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:57:00 25 4
gpt4 key购买 nike

我正在尝试对调用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com