为JavaScript承诺编写测试
我有一个简单的中间层代码,它将被某个人调用,并且它正在调用其他一些api,这些api正在返回承诺为JavaScript承诺编写测试,javascript,promise,Javascript,Promise,我有一个简单的中间层代码,它将被某个人调用,并且它正在调用其他一些api,这些api正在返回承诺 function getSomething() { return api.fetchSomething() .then(response => response) } 为了测试这个,我写了这个测试,它通过了 it('should make a call to api method ', () => { const someResponse = {};
function getSomething() {
return api.fetchSomething()
.then(response => response)
}
为了测试这个,我写了这个测试,它通过了
it('should make a call to api method ', () => {
const someResponse = {};
const fetchSomethingStub = sandbox.stub(api, 'fetchSomething').returns(Promise.resolve(someResponse));
const someResult = getSomething();
someResult.then((result) => {
expect(fetchSomethingStub ).to.have.callCount(1);
expect(result).to.eventually.equal(someResponse);
});
});
但是由于我的
api.fetchSomething()
也可以返回拒绝,我将存根更改为返回Promise.reject
,但测试通过,但带有消息(节点:14688)unhandledPromisejectionWarning:Unhandled Promise拒绝(拒绝id:2):[object object]
。这是否意味着我必须在这一层中设置catch
块才能执行任务。?我计划只传递api中的值。此外,我做的测试正确的承诺。如果您有任何关于使用mocha查找Promise test的建议,我们将不胜感激。因此,基本上您在这段代码中有一个未处理的异常。如果您真的想测试拒绝案例中的行为,那么是的,您需要一个具有.catch
处理程序的测试。如果承诺被拒绝,则不会调用。然后
处理程序,这样您的断言就不会发生
您可以做的另一件事是更改此行:
someResult.then((result) => {
到
这会将承诺返回给Mocha runner,并让它正确地检测到承诺意外被拒绝的失败测试
如果没有它,您的测试中也会有一个同步错误——Mocha不知道在报告结果之前要等待异步工作完成。返回承诺会将您正确地挂接到测试运行程序和结果报告中。因此,基本上您在这段代码中有一个未处理的异常。如果您真的想测试拒绝案例中的行为,那么是的,您需要一个具有
.catch
处理程序的测试。如果承诺被拒绝,则不会调用。然后
处理程序,这样您的断言就不会发生
您可以做的另一件事是更改此行:
someResult.then((result) => {
到
这会将承诺返回给Mocha runner,并让它正确地检测到承诺意外被拒绝的失败测试
如果没有它,您的测试中也会有一个同步错误——Mocha不知道在报告结果之前要等待异步工作完成。返回承诺会将您正确地连接到测试运行程序和结果报告中。从技术上讲,我相信,您实际上可以使用thenable中的一个函数来处理错误:.then((res)=>{},(rej)=>{}),但由于多种原因,不鼓励这样做。捕获是你想要处理这个问题的方式;同意。@thepublimeobject不,不气馁,看一下。如果您的测试想要区分满足和拒绝,您应该使用两个回调函数
then
。从技术上来说,我相信,您实际上可以使用thenable中的函数来处理错误:.then((res)=>{},(rej)=>{}),但由于多种原因,不鼓励这样做。捕获是你想要处理这个问题的方式;同意。@thepublimeobject不,不气馁,看一下。如果您的测试想要区分满足和拒绝,您应该使用带有两个回调的then
。.then(response=>response)
部分是没有意义的。省略它。@Bergi这也意味着解决和拒绝都将传递回claler,并且省略了需要测试的方式?是的,满足和拒绝都将直接传递。如果您已经在测试api.fetchSomething()。省略它。@Bergi这也意味着解决和拒绝都将传递回claler,并且省略了需要测试的方式?是的,满足和拒绝都将直接传递。如果您已经在测试api.fetchSomething()