在进行前端开发时,我们通常会使用 Jest 进行单元测试。但是有时候在进行测试时,会出现 TypeError: Cannot read property 'getAttribute' of null 的错误,这是因为在测试期间,我们的测试代码无法找到对应的元素,从而导致无法读取其属性。本文将介绍这种错误的解决方案,并提供示例代码以供参考。
错误原因
这种错误通常是由于我们的测试代码无法找到对应的元素引起的。例如,我们在测试某个组件的时候,可能会使用类似下面的代码:
const button = document.querySelector('.button'); button.getAttribute('disabled');
但是,如果在测试期间,页面上不存在 .button
类的元素,那么 document.querySelector('.button')
将返回 null,从而导致后续调用 getAttribute
方法时出现 TypeError 错误。
解决方案
为了解决这个问题,我们需要在测试代码中添加一些容错处理,以确保我们的测试代码能够正确地处理不存在的元素。下面是一些常用的解决方案。
方案一:使用 optional chaining
在 JavaScript 中,我们可以使用 optional chaining 运算符 ?.
来简化代码,这个运算符可以帮助我们在访问对象属性时避免出现 TypeError 错误。例如,我们可以将上面的代码改为:
const button = document.querySelector('.button'); button?.getAttribute('disabled');
这样,如果 document.querySelector('.button')
返回 null,后续的 button?.getAttribute('disabled')
将直接返回 undefined,而不会抛出 TypeError 错误。
方案二:使用 try-catch 语句
另一种解决方案是使用 try-catch 语句来捕获错误。例如,我们可以将上面的代码改为:
const button = document.querySelector('.button'); try { button.getAttribute('disabled'); } catch (e) { console.error(e); }
这样,如果 document.querySelector('.button')
返回 null,后续的 button.getAttribute('disabled')
将抛出 TypeError 错误,但是由于我们使用了 try-catch 语句,错误不会导致测试失败,而是会被捕获并输出到控制台中。
方案三:使用 expect 语句
Jest 提供了 expect 语句来帮助我们编写更加简洁和可读的测试代码。在使用 expect 语句时,我们可以使用 toBeNull 或者 toBeUndefined 来判断一个变量是否为 null 或者 undefined。例如,我们可以将上面的代码改为:
const button = document.querySelector('.button'); expect(button.getAttribute('disabled')).toBeNull();
这样,如果 document.querySelector('.button')
返回 null,后续的 button.getAttribute('disabled')
将返回 null,而不会抛出 TypeError 错误。同时,我们使用 expect 语句来判断返回值是否为 null,如果不是,测试将失败并输出错误信息。
示例代码
下面是一个示例代码,它演示了如何在测试代码中使用 optional chaining 运算符、try-catch 语句和 expect 语句来解决 TypeError 错误。
describe('button', () => { test('should have disabled attribute', () => { // 方案一:使用 optional chaining const button1 = document.querySelector('.button'); expect(button1?.getAttribute('disabled')).toBeNull(); // 方案二:使用 try-catch 语句 const button2 = document.querySelector('.button'); try { button2.getAttribute('disabled'); } catch (e) { console.error(e); } // 方案三:使用 expect 语句 const button3 = document.querySelector('.button'); expect(button3.getAttribute('disabled')).toBeNull(); }); });
总结
在进行前端单元测试时,我们可能会遇到 TypeError: Cannot read property 'getAttribute' of null 的错误,这是因为我们的测试代码无法找到对应的元素。为了解决这个问题,我们可以使用 optional chaining 运算符、try-catch 语句和 expect 语句等方法来处理不存在的元素,从而避免 TypeError 错误的出现。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65c469fcadd4f0e0ffee68b3