期望函数在Jest中引发异常

时间:2020-01-15 08:22:04

标签: javascript node.js typescript jestjs

我有一个返回承诺的函数(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

3 个答案:

答案 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();