如何模拟方法或函数以返回预期的错误

时间:2019-02-09 00:13:00

标签: javascript typescript jestjs

尝试学习如何使用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 . 

2 个答案:

答案 0 :(得分:1)

listStacksasync函数。

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,以便在出现该错误时抛出该错误。