在前端开发中,单元测试是一个非常重要的环节。而 Jest 是一个流行的 JavaScript 单元测试框架,它提供了丰富的功能和易于使用的 API。然而,在进行 Jest 单元测试时,我们可能会遇到一个错误:Received function did not throw。这个错误表示我们期望测试的函数会抛出一个异常,但实际上却没有抛出。本文将介绍这个问题的原因、解决方案以及如何预防这个问题的发生。
问题原因
在 Jest 中,我们可以使用 toThrow
方法来测试一个函数是否会抛出异常。例如,下面的代码测试了一个抛出错误的函数:
function throwError() { throw new Error('Error Message'); } test('throwError should throw an error', () => { expect(throwError).toThrow('Error Message'); });
然而,当我们使用 toThrow
方法测试一个没有抛出异常的函数时,Jest 将会抛出一个 Received function did not throw
的错误。例如,下面的代码测试了一个没有抛出错误的函数:
function noError() { // do something } test('noError should throw an error', () => { expect(noError).toThrow('Error Message'); });
在这种情况下,Jest 将会抛出 Received function did not throw
的错误,因为我们期望 noError
函数会抛出一个错误,但实际上它没有抛出。
解决方案
要解决这个问题,我们可以使用 toThrowError
方法代替 toThrow
方法。toThrowError
方法可以测试一个函数是否抛出了一个特定类型的错误。例如,下面的代码测试了一个抛出类型为 Error
的错误的函数:
function throwError() { throw new Error('Error Message'); } test('throwError should throw an error', () => { expect(throwError).toThrowError(Error); });
然而,当我们使用 toThrowError
方法测试一个没有抛出错误的函数时,Jest 将不会抛出任何错误。因此,我们需要使用 toThrowError
方法的第二个参数来测试错误消息。例如,下面的代码测试了一个没有抛出错误消息为 Error Message
的函数:
function noError() { // do something } test('noError should throw an error', () => { expect(noError).toThrowError(Error, 'Error Message'); });
在这种情况下,如果 noError
函数没有抛出错误或者抛出的错误消息不是 Error Message
,Jest 将会抛出一个错误。
预防措施
除了使用 toThrowError
方法之外,我们还可以采取一些预防措施来避免 Received function did not throw
错误的发生。首先,我们应该确保我们的测试用例覆盖了所有可能的情况,包括正常情况和异常情况。其次,我们应该尽可能地使用断言来测试我们的代码。断言可以帮助我们在测试过程中快速发现错误,并且可以提高代码的可读性和可维护性。
例如,下面的代码使用了多个断言来测试一个函数:
-- -------------------- ---- ------- -------- --------- -- - -- -- --- -- - ----- --- ------------- -- ------- - ------ - - -- - ------------ ------ ------ --- ------- -------- -- -- - ---------------- ------------ ---------------- ------------ --------- -- - --------- --- ---------------------- ------- -- ------- ---
在这个例子中,我们使用了三个断言来测试 divide
函数。第一个断言测试了正常情况,第二个断言测试了边界情况,第三个断言测试了异常情况。使用多个断言可以帮助我们更全面地测试我们的代码,并且可以提高测试的可靠性。
结论
Jest 单元测试失败:Received function did not throw 的错误提示可能会让我们迷惑,但是我们可以通过使用 toThrowError
方法以及采取预防措施来避免这个问题的发生。在编写测试用例时,我们应该尽可能地使用断言来测试我们的代码,并且应该确保我们的测试用例覆盖了所有可能的情况。这样可以帮助我们更全面地测试我们的代码,并且可以提高代码的质量和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6742a4dedb344dd98de08fd8