如何断言nodeunit中的错误消息?

How to assert on error message in nodeunit?

我正在尝试编写断言来检查 nodeunit 中的错误消息。如果错误消息与我的预期不符,我希望测试失败。但是,似乎 API 不存在。这是我正在尝试做的事情:

foo.js

function foo() {
  ...
  throw new MyError('Some complex message');
}

foo.test.js

testFoo(test) {
  test.throws(foo, MyError, 'Some complex message');
}

如果错误消息是 而不是 'Some complex message',我希望 testFoo 失败,但事实并非如此。似乎 'Some complex message' 只是一条解释测试失败的消息。它不涉及断言。在 nodeunit 中执行此操作的最佳方法是什么?

下面的方法nodeunit API

throws(block, [error], [message]) - Expects block to throw an error.

可以为[error]参数接受一个函数。 该函数采用 actual 参数和 returns true|false 来指示断言的成功或失败。

这样,如果您希望断言某些方法抛出 Error 并且该错误包含某些特定消息,您应该编写如下测试:

  test.throws(foo, function(err) {
    return (err instanceof Error) && /message to validate/.test(err)
  }, 'assertion message');

示例:

function MyError(msg) {
  this.message = msg;
}
MyError.prototype = Error.prototype;

function foo() {
  throw new MyError('message to validate');
}

exports.testFooOk = function(test) {
  test.throws(foo, function(actual) { 
    return (actual instanceof MyError) && /message to validate/.test(actual) 
  }, 'Assertion message');
  test.done();
};

exports.testFooFail = function(test) {
  test.throws(foo, function(actual) { 
    return (actual instanceof MyError) && /another message/.test(actual) 
  }, 'Assertion message');
  test.done();
};

输出:

✔ testFooOk
✖ testFooFail

实际上,任何实现 node.js assert 模块功能的测试框架都支持它。例如:node.js assert or Should.js