我正在使用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错误背后的原因是什么
答案 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'));
}
});