【问题标题】:How to assert that a function does not raise an exception如何断言函数不会引发异常
【发布时间】:2012-04-07 00:30:48
【问题描述】:

QUnit 有一个用于测试函数是否引发异常的断言 (QUnit/raises)。是否有可能——使用 QUnit——断言函数不会引发异常。

我意识到可以像下面的代码一样对其进行测试:

try {
    theTest();
    ok(true);
} catch (e) {
    ok(false, "Expected to succeed");
}

但我认为使用 QUnit 应该是可能的。有什么线索吗?

【问题讨论】:

标签: javascript unit-testing testing qunit


【解决方案1】:

qunit中没有这种方法

但是,如果您只编写以下更短的代码,您将获得相同的结果并具有额外的好处

theTest();
ok(true, "My function does not crash");

1/ 如果测试代码引发异常,qunit 会将测试标记为失败。

2/ 如果您选中“no try/catch”复选框,您将能够调试抛出异常的位置,而您的 try/catch 则不是这种情况

【讨论】:

  • 当然!这很简单。显然对我来说有点太简单了。感谢您的回答:)
  • 事实证明,这有点太简单了。如果函数引发异常,则测试失败没有失败消息。如果函数没有引发异常,则测试按预期成功。 ok()-assertion 中的消息永远不会被使用。
  • 请注意,您可能还应该在 test() 函数中添加对 expect() 的调用,以便也可以通过这种方式验证断言的数量。
  • ok() 断言是必需的,因为没有断言的测试将在 qunit 中失败
【解决方案2】:

我遇到了与您在评论中提到的相同的问题,即我的测试未抛出 Error 将停止“严重”地显示格式错误的 Died on test #1 消息而没有任何有用信息。

我最终将两者混合使用; raises() 用于一项测试,try/catch 用于另一项测试。

我使用 raises() 来测试是否抛出了 Error,类似于:

test("When myFunction() is called with a invalid instance Then Error is thrown", function () {
    // Arrange
    var testInstance = {};

    // Act
    raises(function() {
        myFunction(testInstance);
    }, Error, "myFunction() should throw an Error");

    // Assert
    // raises() does assertion
});

如果上面抛出一个Error,一切都很好,如果不是很好的格式化消息,则会显示,类似于:

myFunction() should throw Error
Result: No exception was thrown.

然后我使用try/catch 进行必须确保没有Error 被抛出的测试,类似于:

test("When myFunction() is called with a valid instance Then no Error is thrown", function () {
    // Arrange
    var testInstance = new myObject();
    var result;

    // Act
    try {
        myFunction(testInstance);
        result = true;
    } catch(error) {
        result = false;
    }

    // Assert
    ok(result, "myFunction() should not throw an Error"); 
});

如果上面没有抛出Error,一切都很好,如果抛出Error,则会显示一条格式良好的消息,类似于:

myFunction() should not throw an Error
Source: ...

【讨论】:

  • 以上假设您正在测试托管的自定义抛出的错误,并且您的myFunction() 确实在某个无效条件下故意执行throw new Error(...)。您不应该测试意外错误。
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2014-06-13
  • 2019-01-28
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2023-01-11
相关资源
最近更新 更多