You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: ...

请问该如何正确配置这个测试?


解决方案

问题根源

测试失败有两个核心原因:

  1. 错误判断逻辑错误:error.toString()的返回值是"Error: test message error",而非你写的"test message error",导致匹配条件永远不成立。
  2. 语法错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:33:02