Javascript 使用Jest和Create React App(CRA)为异步函数中的同步代码预期函数抛出

Javascript 使用Jest和Create React App(CRA)为异步函数中的同步代码预期函数抛出,javascript,asynchronous,synchronization,jestjs,Javascript,Asynchronous,Synchronization,Jestjs,我正在使用Jest对CreateReact应用程序进行测试,我正在尝试测试一个异步函数和一个同步代码,我需要在同步部分出错时抛出它 测试包括在接收错误参数类型时期望函数抛出 函数在接收非未定义的参数类型时抛出“无效参数”。(不带参数的函数)或“数字” 用户API是要调用的API url 以下是函数: export const getUsers = async (count, ...rest) => { if (["undefined", "number"].includes(typeo

我正在使用Jest对CreateReact应用程序进行测试,我正在尝试测试一个异步函数和一个同步代码,我需要在同步部分出错时抛出它

测试包括在接收错误参数类型时期望函数抛出

函数在接收非未定义的参数类型时抛出“无效参数”。(不带参数的函数)或“数字”

用户API是要调用的API url

以下是函数:

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,但它没有抛出任何东西


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


谢谢。

因为您的
getUsers
是一个函数,所以它是。 因此,为了测试它,您需要执行以下操作:

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);
    }
});

您可以在这里获得更多详细信息:

我不明白您为什么要这样编写此函数。如果您的计数会限制响应长度,那么这种预先指定计数的方法会很有趣,例如使用查询参数。在您的情况下,您只是将膨胀添加到一个简单的fetch中,将关注点分为两个不同的函数(fetch和slice)可能与@BJRINT重复。谢谢您的回复,但我真的不知道什么时候在函数内部或外部进行测试?例如,请查看此链接:@brian住在户外不,我的问题是同步和异步之间的组合这就是诀窍!这是。将函数更改为抛出一个实际的
错误,如下所示:
抛出新错误(“无效参数”)和您的测试成为just
expect(getUsers(str)).rejects.toThrow(/invalid/gi)你好,它工作了谢谢你,我的坏我在等待它抛出时传递了一个号码(这是错误的):帕根,这是一个。函数应该抛出如下的
错误:
抛出新错误(“无效参数”)。然后测试就是:
expect(getUsers(str)).rejects.toThrow(/invalid/gi)