gpt4 book ai didi

javascript - 使用 Mocha、Chai 和 Sinon 在 Promise 完成后测试非 Promise

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:26 24 4
gpt4 key购买 nike

我在 Redux 中创建了一个小型学习项目,并且基本上从 documentation 复制了异步操作的中间件。 。现在我想为它编写一些测试,以确保在我更改一些内容后它能够正常工作。

为了编写测试,我使用 Mocha、chai、chai-as-promised 和 sinon。

我对 redux 没有任何问题,但我不确定如何测试。

中间件的相关代码:

export default function callApiMiddleware({ dispatch }) {
return next => action => {
// ... various checks

const [ requestType, successType, errorType ] = types;
dispatch({ ...payload, type: requestType });

return callApi().then(
response => dispatch({ ...payload, type: successType, response }),
error => dispatch({ ...payload, type: errorType, error })
);
}
}

无论 promise 是履行还是拒绝,中间件都会调度适当的操作。

为了测试这一点,我与其他函数一起删除了调度函数,并且还传递了一个虚拟的 promise ,我根据我想要测试的内容来实现或拒绝该 promise 。

我编写的测试如下所示:

it('should trigger success action when successful', () => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi: () => new Promise((resolve, reject) => resolve('SUCCESS'))
});
return expect(promise).to.eventually.be.fulfilled;
});

这工作正常,但我遇到的第一个问题是当我尝试模拟可能因没有互联网连接而导致的被拒绝的 promise 时,所以我编写了这个测试:

it('should trigger failure action when failure occurs', () => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi: () => new Promise((resolve, reject) => reject('ERROR'))
});
return expect(promise).to.eventually.be.rejected;
});

但是失败并显示以下消息:

AssertionError: expected promise to be rejected but it was fulfilled with undefined

Expected :[undefined]

Actual :[undefined]

这对我来说毫无意义,因为我明确传递了一个唯一功能就是被拒绝的 promise 。

我的另一个问题是我还想做出其他断言,这些断言不一定与 promise 本身有任何关系,但必须在 promise 完成时进行评估,例如我想断言 dispatch 方法被调用了两次。 dispatch 方法本身在使用 sinon 的测试中被删除,以便执行所需的断言。潜在地,我想以这种方式做出多个断言。

我尝试过以下方法:

it('should trigger success action when successful', () => {
let promise = callApiMiddleware({ dispatch, getState })(next)({
...action,
callApi: () => new Promise((resolve, reject) => resolve('SUCCESS'))
});
return Q.all([
expect(promise).to.eventually.be.fulfilled,
expect(dispatch).to.eventually.be.calledTwice
]);
});

但这会返回一些非常大的错误,它只是告诉我 dispatch 不是 thenable 即不是一个 promise 。

我不知道如何做到这一点,因此任何意见将不胜感激。

最佳答案

Promise 不会重新抛出错误,因此如果您在第一个 catch 处理程序中捕获错误,则 Promise 将在下一个处理程序中实现,除非您再次抛出捕获的错误。

// this does not work
promise.catch((e) => console.log(e)).catch((e) => console.log(e));

如果你想让它起作用,你必须重新抛出错误。

promise.catch((e) => {
console.log(e);
throw e;
}).catch((e) => console.log(e));

如果你想让测试通过,你需要重新抛出在 Promise 的 catch 处理程序中捕获的错误。所以你的代码应该是这样的:

export default function callApiMiddleware({ dispatch }) {
return next => action => {
// ... various checks

const [ requestType, successType, errorType ] = types;
dispatch({ ...payload, type: requestType });

return callApi().then(
response => dispatch({ ...payload, type: successType, response }),
error => {
dispatch({ ...payload, type: errorType, error });
throw error;
}
);
}
}

关于javascript - 使用 Mocha、Chai 和 Sinon 在 Promise 完成后测试非 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675694/

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