为JavaScript承诺编写测试

为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 = {};

我有一个简单的中间层代码,它将被某个人调用,并且它正在调用其他一些api,这些api正在返回承诺

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