2

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

foo.js

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

foo.test.js

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

如果错误消息不是“一些复杂的消息”,我想testFoo失败,但这不是它的工作方式。似乎“一些复杂的消息”只是解释测试失败的消息。它不涉及断言。在 nodeunit 中执行此操作的最佳方法是什么?

4

1 回答 1

2

nodeunit API的以下方法

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

可以接受 [error] 参数的函数。该函数接受actual参数并返回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 断言模块实现功能的测试框架都支持它。例如:node.js 断言Should.js

于 2015-12-17T09:07:53.447 回答