测试是前端开发中不可或缺的环节,而异常测试是其中特别重要的一部分。在测试过程中,我们可以用 Chai.js 来断言某个函数或代码片段是否能够正常地运行或者抛出异常。本文将介绍 Chai.js 中的 does.not.throw 方法,它能够帮助我们更好地进行异常测试。
does.not.throw 基本用法
Chai.js 是一个流行的 JavaScript 断言库,它支持 TDD 和 BDD 风格的测试。在 TDD 风格中,我们使用 assert 方法来做断言;在 BDD 风格中,我们使用 expect 或者 should 方法来做断言。在本文中,我们将使用 expect 方法来做断言。
does.not.throw
方法可以用来测试是否抛出了异常。我们可以用以下语法来断言一个函数不会抛出异常:
expect(function () { // some code }).to.not.throw();
其中,function () { /* some code */ }
表示需要被测试的函数,它可以是一个普通函数、箭头函数、匿名函数等等。如果测试过程中没有抛出任何异常,则测试通过。
如果需要测试代码是否会抛出某种异常,可以传入一个异常类型作为参数。例如,我们可以使用以下语法来测试代码是否会抛出 TypeError
异常:
expect(function () { // some code }).to.throw(TypeError);
这里的 TypeError
是一个内置的异常类型。我们还可以自定义异常类型,方法是创建一个继承自 Error
的子类,例如:
class CustomError extends Error { constructor(message) { super(message); this.name = 'CustomError'; } }
然后就可以在测试中使用这个异常类型了:
expect(function () { throw new CustomError('something went wrong'); }).to.throw(CustomError);
does.not.throw 的深度应用
使用 does.not.throw
方法进行简单的异常测试非常容易,但是在实际开发中,测试的场景经常非常复杂。本节将介绍一些使用 does.not.throw
方法进行深度应用的例子。
验证错误信息
有时候我们需要验证抛出的异常信息是否正确。例如,我们可以使用以下代码片段来测试函数 parseJSON
是否能够正确处理错误的 JSON 格式:
// javascriptcn.com 代码示例 function parseJSON(jsonString) { try { return JSON.parse(jsonString); } catch (e) { throw new Error(`Failed to parse JSON: ${e.message}`); } } expect(function () { parseJSON('{key: value}'); }).to.throw(Error, /^Failed to parse JSON:/);
其中,/^Failed to parse JSON:/
是一个正则表达式,表示异常信息应该以 Failed to parse JSON:
开头。
验证异常对象
如果我们需要在测试代码中对异常对象进行进一步的操作,可以使用 does.not.throw
方法的链式调用。例如,以下代码片段测试了函数 parseXML 是否能够正确处理错误的 XML 格式:
// javascriptcn.com 代码示例 function parseXML(xmlString) { const parser = new DOMParser(); const doc = parser.parseFromString(xmlString, 'text/xml'); if (doc.getElementsByTagName('parsererror').length) { throw new Error('Failed to parse XML'); } return doc; } expect(function () { parseXML('<xml><node>'); }).to.throw(Error).with.property('message', 'Failed to parse XML');
其中,.with.property
方法用来访问异常对象的属性。这里我们访问了异常的 message
属性,并做了进一步的测试。
验证异常的上下文
有时候异常的上下文信息非常重要,它能够帮助我们更好地理解、调试代码。例如,以下代码片段测试了函数 fetchResource 是否能够正确处理 HTTP 异常情况:
// javascriptcn.com 代码示例 async function fetchResource(url) { const response = await fetch(url); if (!response.ok) { const text = await response.text(); throw new Error(`HTTP error ${response.status}: ${text}`); } return await response.json(); } expect(async function () { await fetchResource('https://example.com/notexist'); }).to.throw(Error).with.property('message').that.includes('HTTP error');
其中,.with.property('message').that.includes
方法用来访问异常消息,并检查是否包含了关键字 HTTP error
。这里我们还使用了 async/await 语法来编写异步测试代码。
总结
本文介绍了在 Chai.js 中使用 does.not.throw
方法进行异常测试的基础用法和深度应用。通过灵活使用断言库,我们可以更快速、准确地编写测试代码,从而提高开发效率和代码质量。
示例代码:https://codepen.io/zqqiang/pen/vYZOJjK
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654e888a7d4982a6eb7aec21