议程
- 这篇文章的目标
- 期望。发言(编号)而不是完成()
- 拒绝而不是try-catch
- 。
- 用例1:处理函数中的错误
- 用例2:处理异步函数中的错误
- 参考
1.这篇文章的目标
这篇文章的目的是为您提供一种如何用开玩笑处理错误的自信方法。由于包括官方指南在内的一堆来源提出了各种方式(但每种方式都有自己的规则符合ð€),因此它会误导测试。
2.期望。发表(编号)而不是完成()
tocred.assertions()和done()用于测试异步函数。但是,Expect.Servions()专注于验证在完成()时都会在测试期间调用一定数量的断言(),以等待一定的断言。因此,如果未完成()未拨打期望的数量,则会失败()由于超时而失败(大多数是从末尾不调用())。
让我们在做异步调用时进行比较()和期望。
API - expect.assertions(number)
确保添加期望。发表以验证调用一定数量的断言。否则,实现的诺言将不会失败。
test('doAsync calls both callbacks', () => {
expect.assertions(2);
function callback1(data) {
expect(data).toBeTruthy();
}
function callback2(data) {
expect(data).toBeTruthy();
}
doAsync(callback1, callback2);
});
vs。
Testing Asynchronous Code - callbacks
done()是必要的。否则,在fetchdata完成后,在调用回调之前,该测试将立即完成。
test('the data is peanut butter', done => {
function callback(error, data) {
if (error) {
done(error);
return;
}
try {
expect(data).toBe('peanut butter');
done();
} catch (error) {
done(error);
}
}
fetchData(callback);
});
您可能会发现完成(错误)在捕获块中声明(错误)以避免超时。一方面,您可以轻松地注意到错误并减少时间来弄清楚这样做的问题。另一方面,您可以轻松地忘记需要正确声明()的位置。
这里的拇指规则是声明期望。在测试开始时发表(编号)。它根本不会引起问题。
3.。拒绝而不是try-catch
使用。拒绝以解开拒绝承诺的原因,以便可以将任何其他匹配者束缚。如果承诺实现了,则断言失败了。
test('rejects to octopus', async () => {
await expect(Promise.reject(new Error('octopus'))).rejects.toThrow('octopus');
});
vs。
您必须在捕获块上处理错误。
it('calls the API and throws an error', async () => {
expect.assertions(2);
try {
await login('email', 'password');
} catch (error) {
expect(error.name).toEqual('Unauthorized');
expect(error.status).toEqual(401);
}
});
您知道测试应该导致错误。 .redjects()的关键点是,当承诺实现时,断言会失败。
!CAUTION
请确保返回(或等待)承诺 - 如果您省略了退货/等待声明,则您的测试将在FetchData退还或拒绝的承诺退还之前完成。
!tip
期望。不需要使用。拒绝时,建议在测试期间验证一定数量的断言。
4.。
您可以提供一个可选的参数来测试是否抛出了特定错误,例如Regex,String,错误对象和错误类。但是,tomatch和toe eere只做一件事:匹配一个字符串并等于对象。
test('throws on octopus', () => {
expect(() => {
drinkFlavor('octopus');
}).toThrow();
});
test("Test description", () => {
const t = () => {
throw new TypeError("UNKNOWN ERROR");
};
expect(t).toThrow(TypeError);
expect(t).toThrow("UNKNOWN ERROR");
});
!tip
您必须将代码包裹在功能中,否则不会捕获错误,并且断言将失败。
!提示
您无需包装承诺功能。只是调用它。
Code Example
test('the fetch fails with an error', async () => {
await expect(fetchData()).rejects.toMatch('error');
});
5.用例1:处理函数中的错误
让我们将我们学到的知识集成到简单的代码段中。
test("Test description", () => {
expect.assertions(2);
const t = () => {
throw new TypeError("UNKNOWN ERROR");
};
expect(t).toThrow(TypeError);
expect(t).toThrow("UNKNOWN ERROR");
});
- 我声明了期望。发出(数字)即使上述测试不是异步的。没关系,因为Expect.assertions()根本不会引起问题。
- 我使用.tothrow()而不是.toMatch或.to.to.totore,因为它处理了错误对象和字符串。
6.用例2:处理异步功能中的错误
test('the fetch fails with an error', async () => {
expect.assertions(1);
await expect(fetchData()).rejects.toThrow('error');
});
- 我声明了期望。发出(编号),即使使用.rejects()。 时不需要。
- 我通过在一个块中而不是在trycatch块中使用.REPENTS来处理一个错误。
- 我使用的是.tothrow而不是.tomatch或.toe equal。