QUnit中assert.throws()测试失效,如何正确配置该测试?
问题描述
我可能没搞懂QUnit中assert.throws()的用法,导致测试无法正常运行。我需要测试一个函数抛出的预期错误:
被测试函数(file_to_test.js)
// file_to_test.js ... myFunctionToTest: function(param1, param2 = "AA-BB") { const idx1 = param2.indexOf("AA"); if(idx1 === -1) { throw new Error('test message error'); } }
我的测试代码(test.js)
// test.js sap.ui.define(["path/to/my/script"], function(myScriptToTest) { ... QUnit.test('should thrown error', assert => { assert.throws( function() { myScriptToTest.myFunctionToTest('blabla', 'blubblub'); // 测试在此处出错 }, function(error) { return error.toString() === 'test message error'; }, 'Error thrown' } // 这里存在语法错误:缺少闭合括号 ) })
浏览器输出结果
1. Error thrown Expected: function( a ){ [code] } Result: Error("test message error") Diff: function( a ){ [code] }Error("test message error") Source: ...
请问该如何正确配置这个测试?
解决方案
问题根源
测试失败有两个核心原因:
- 错误判断逻辑错误:
error.toString()的返回值是"Error: test message error",而非你写的"test message error",导致匹配条件永远不成立。 - 语法错误:
assert.throws()调用末尾多写了一个},应该用)闭合。
正确的测试写法
你可以通过以下几种方式正确验证错误:
方式1:检查错误的message属性(推荐)
直接读取Error对象的message属性,这是最准确可靠的方式:
QUnit.test('should throw error', assert => { assert.throws( () => { myScriptToTest.myFunctionToTest('blabla', 'blubblub'); }, error => error.message === 'test message error', 'Error thrown with expected message' ); // 修正语法错误:用)闭合调用 });
方式2:使用正则表达式匹配
如果需要更灵活的内容匹配,可以用正则表达式:
QUnit.test('should throw error', assert => { assert.throws( () => { myScriptToTest.myFunctionToTest('blabla', 'blubblub'); }, /test message error/, 'Error thrown with expected message' ); });
方式3:验证错误类型(仅需确认错误类型时)
如果只需要验证抛出的是Error类型,不需要检查具体消息,可以直接传入Error构造函数:
QUnit.test('should throw error', assert => { assert.throws( () => { myScriptToTest.myFunctionToTest('blabla', 'blubblub'); }, Error, 'Throws an Error type' ); });
注意事项
- 确保测试代码的语法正确,所有括号、引号都正确闭合。
- 优先使用
error.message验证错误内容,比toString()更稳定,因为toString()的输出格式可能因运行环境略有差异。
内容的提问来源于stack exchange,提问作者rammi22
相关产品推荐
相关产品推荐

