投掷错误时Jest没有通过测试

时间:2018-04-17 14:26:03

标签: ecmascript-6 jest nock

我正在使用Jest测试我的代码并使用nock JSON响应模拟http调用:     它('当记录不存在时应该抛出错误',async()=> {

SELECT
    o.OrderID,
    c.CustomerName
FROM
    "Orders" o
    inner join "Customers" c on o.Customer_Id = c.Customer_Id;

如果状态代码为>,则存在异步函数,该函数应该失败。 300并创建新的错误:

SYS

当我正在运行测试时,JEST正在抛出:

          const noExistsJSONFile = path.join(__dirname, "../../../data/api/project/non-existing.json");
          nock(__ROOT_API__)
            .defaultReplyHeaders({ 'access-control-allow-origin': '*' })
            .get('/projects/2500')
            .replyWithFile(404, noExistsJSONFile);

          const response = await getProject('/projects/2500');

          expect(response).toThrowError(`${notExisting.errorMessage} (Code: ${notExisting.errorCode})`);

        });
      });

当我查看Chrome网络流量时,我会回复我需要的内容。 JEST错误背后的原因是什么

2 个答案:

答案 0 :(得分:1)

这是因为您正在开始提取,因此,在toThrowError匹配器之前抛出错误。此外,这是一个异步调用,这使得测试更加复杂,因此,不是使用用于同步函数调用的toThrow匹配器,而是可以使用try / catch块await语法,如documentation

中所述
expect.assertions(1);
try {
  await getProject('/projects/2500');
} catch (e) {
   expect(e).toMatch(`${notExisting.errorMessage} (Code: ${notExisting.errorCode})`);
}

expect.assertions(1)告诉jest在测试中期望一个断言。

答案 1 :(得分:0)

我对代码做了一些小改动 - 没有按预期工作100%但是关闭。 改变一点响应功能:

export async function get(pathname) {
    const params = {
      headers: {
        'Content-Type': 'application/json',
      }
    };
    let response = await fetch(`${__ROOT_API__}${pathname}`, params);
    if (!validateStatusCode(response)) {
      const res = await response.json();
      throw new Error(res.errorMessage);
    }
    return response.json();
}

测试看起来像这样:

 it('should throw error when record does not exists', async () => {
      const noExistsJSONFile = path.join(__dirname, "../../../data/api/project/non-existing.json");
      nock(__ROOT_API__)
        .defaultReplyHeaders({ 'access-control-allow-origin': '*' })
        .get('/projects/2500')
        .replyWithFile(404, noExistsJSONFile);

      try {
        await getProject('/projects/2500');
      } catch (error) {
        expect(error).toEqual(new Error('error message'));

      }

    });