尝试学习如何使用Jest / Typescript编写更好的测试。我想确保可以测试一个错误。
我可以创建模拟方法,该方法将返回预期的数据数组,但是事实证明测试错误很困难。
//program.ts
const listStacks = async (cf: CloudFormation): Promise<StackSummaries> => {
try {
const result = await cf.listStacks().promise();
if (result.StackSummaries) {
return result.StackSummaries;
}
return [];
} catch(e) {
console.log(e);
throw e;
}
这是我下面的测试,请注意,我尝试返回一个新的Error而不是throw,但这似乎也不起作用。
//program.test.js
it('handles errors gracefully', async () => {
expect.assertions(1);
const cfMock = {
listStacks: (): any => ({
promise: async () => {
throw new Error('ohh NOO!');
}
})
}
expect(() => listStacks(cfMock as CloudFormation)).toThrow();
Jest返回此:
expect(received).toThrow()
Received function did not throw .
答案 0 :(得分:1)
listStacks
是async
函数。
async
函数return the following:
一个
Promise
,它将由async函数返回的值来解析,或者被async函数内部抛出的未捕获的异常拒绝。
在这种情况下,您将提供一个模拟,该模拟会导致在async
函数中引发未捕获的异常,因此它将返回Promise
,它将被未捕获的异常拒绝。
要验证此行为,请将您的expect
行更改为以下内容:
await expect(listStacks(cfMock)).rejects.toThrow(); // SUCCESS
请注意,toThrow
已针对PR 4884的承诺进行了修复,因此,如果您使用的是Jest
的旧版本(22.0.0之前的版本),则需要使用类似{{1 }}:
toEqual
答案 1 :(得分:0)
尝试将throw
语句放在try
块中进行的操作内。例如:
if(!result.StackSummaries) {
throw new Error('error message to assert')
}
catch
块将捕获在try
块中引发的任何错误,因此您可以将listStacks的返回值模拟为null,以便在出现该错误时抛出该错误。