我有一个返回承诺的函数(hostelService.book
):返回Promise.resolve(response);
我做了这个测试:
const action = async () => {
await hostelService.book(id);
};
await expect(action).rejects.toThrow();
但是我有这个错误:
Matcher error: received value must be a promise
答案 0 :(得分:5)
Jest抛出此错误Matcher error: received value must be a promise
,因为在expect
中您只是传递了函数引用。如果没有()
-action
只是一个函数引用,它将不会返回任何内容。
要解决此问题,您必须像action()
那样按预期方式调用函数,这样它将返回promise对象。
第二部分,您必须抛出类似的错误。 Promise.reject(new Error('some error'));
被拒收,因此tothrow
条件可以完全满足。
示例:
function hostelService() {
return Promise.reject(new Error('some error'));
}
const action = async () => {
await hostelService();
};
it( "Should throw the error", async () => {
await expect(action()).rejects.toThrow('some error');
});
希望这会有所帮助。
答案 1 :(得分:3)
您的测试失败,因为您正在等待承诺(因此,当您在其上致电.rejects
时,它不再是一个承诺)。如果您从最后一条语句中删除await
,它应该可以解决这个问题:
const action = async () => {
await hostelService.book(id);
};
expect(action()).rejects.toThrow();
这里有一些依据。 async
自动将您的返回类型包装为Promise。但是,当您调用await
时,它会同步“解包”给定Promise的值,因此不能在结果上调用.rejects
(除非您将Promise包装到另一个Promise中)。>
我撰写了a small example来说明我的意思。
答案 2 :(得分:1)
这里的动作是函数,您没有从期望中调用它。我还从最后一行删除了等待状态
尝试此解决方案
const action = async () => {
await hostelService.book(id);
};
expect(action()).rejects.toThrow();