简介
在前端开发中,单元测试是常见的开发方式,而 Chai 是一个流行的 JavaScript 断言库,它提供了多种语法供开发者进行测试。然而,使用 Chai 进行测试时,有时会出现 TypeError: Cannot read property 'throw' of undefined 这样的报错,本文将介绍该报错的原因和解决方法。
原因
通常情况下,该报错是由于使用了 Chai 的 throw 断言,但其参数没有被正确设置。在使用 throw 断言时,必须提供一个函数来执行,在该函数中抛出异常。如果未提供该函数,则会出现 TypeError: Cannot read property 'throw' of undefined 报错。
下面是一个示例代码:
const chai = require('chai'); const expect = chai.expect; describe('Test', () => { it('should throw error', () => { expect(() => {}).to.throw('error'); }); });
在该示例中,expect 的参数是一个空箭头函数,该函数中没有抛出异常。因此,执行 expect(() => {}).to.throw('error') 时,会出现 TypeError: Cannot read property 'throw' of undefined 报错。
解决方法
为了解决该报错,需要确保使用 throw 断言时,提供了一个函数,在该函数中抛出异常。可以通过以下两种方式来避免该报错:
方式一
在使用 throw 断言时,确保提供了一个函数,在该函数中抛出异常。下面是一个修复示例:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------ ---------------- -- -- - ---------- ----- ------- -- -- - --------- -- - ----- --- --------------- --------------------- --- ---
在修复的示例中,提供了一个函数,在该函数中抛出了一个 Error 异常。执行 expect(() => {}).to.throw('error') 时,不再出现 TypeError: Cannot read property 'throw' of undefined 报错。
方式二
避免使用 throw 断言。如果不需要测试代码抛出异常的情况,可以使用其他的断言。
下面是一个示例代码,使用了不依赖于 throw 的断言 expect().to.exist:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - ------------ ---------------- -- -- - ---------- ------- -- -- - ----- --- - - ----- ------ -- --------------------- --- ---
在该示例中,使用了 expect(obj).to.exist,而不是 expect(() => {}).to.throw('error')。由于不需要测试代码抛出异常的情况,因此避免了出现 TypeError: Cannot read property 'throw' of undefined 报错。
结论
在使用 Chai 进行单元测试时,避免出现 TypeError: Cannot read property 'throw' of undefined 报错的方法,是确保使用 throw 断言时,提供了一个函数,在该函数中抛出异常。或者避免使用 throw 断言,选择其他的断言。这样能够保证单元测试的进行,为代码质量保驾护航。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67028bb0d91dce0dc847b8a6