期望使用带有Create React App(CRA)的Jest的异步函数中的同步代码抛出函数

时间:2019-03-26 14:12:44

标签: javascript asynchronous synchronization jestjs

我正在使用Jest对Create React App进行测试,并且试图与同步代码一起测试异步函数,并且当同步部分出现错误时,我需要将其抛出。

测试是在接收错误的参数类型时期望函数抛出。

函数收到除“未定义” (不带参数的函数)或“数字” 以外的参数类型时,该函数抛出“无效参数” 。 >。

USER_API是要调用的API网址。

功能如下:

export const getUsers = async (count, ...rest) => {
  if (["undefined", "number"].includes(typeof count) && rest.length === 0) {
    const response = await fetch(USERS_API);
    const users = await response.json();
    if (count && typeof count === "number") {
      return users.slice(0, count - 1);
    }
    return users;
  }
  throw "Invalid arguments.";
};

这是测试:

it.only("should throw on invalid arguments", () => {
  const str = "hello";
  expect(() => getUsers(str)).toThrow(/invalid/gi);
});

我扩展了抛出函数

但是运行测试显示: 预期该函数将引发错误匹配:/ invalid / gi,但未引发任何错误。


测试方法正确还是我写的测试不好?如果不好,我该如何改善?

谢谢。

1 个答案:

答案 0 :(得分:1)

由于您的getUsersasync函数,因此它是returns a Promise。 因此,要对其进行测试,您需要执行以下操作:

it.only ( "should throw on invalid arguments", () => {
    const str = "hello";
    getUsers ( str ).then ( function ( success ) {

    }, function ( err ) {
        expect ( err ).toBe ( /invalid/gi );
    } );

测试异步代码的其他方法之一是:

it.only ( "should throw on invalid arguments", () => {
    const str = "hello";
    try {
        await getUsers("hello");
    } catch (e) {
        expect(e).toMatch(/invalid/gi);
    }
});

您可以在此处获得更多详细信息:Jest: Testing Asynchronous Code