1

我想让我的单元测试断言一个特定的函数调用在预期的时候特别抛出一个 AssertionError,而不是它根本抛出一个异常。断言库(期望)通过传入异常构造函数来支持这样的事情,但我似乎无法找到 AssertionError 构造函数的导出位置(如果在任何地方)。它是否只是一个内部类而不暴露给我们?文档包含许多对它的引用,但没有链接。

我有一个超级hacky的方式:

let AssertionError;

try {
    const assert = require("assert");

    assert.fail();
}
catch (ex) {
    AssertionError = ex.constructor;
}

但我希望有更好的方法。

4

2 回答 2

2

断言错误类在这里定义:

assert.AssertionError

*它在测试时很有用,AsserionError 是预期的结果:

assert.throws( FunctionThatShouldThrow_AssertionError, assert.AssertionError )
于 2017-11-22T11:56:43.040 回答
0

在对 Nodejs github repo 进行研究之后,我可以告诉你它在这里: https ://github.com/nodejs/node/blob/c75f87cc4c8d3699e081d37bb5bf47a70d830fdb/lib/internal/errors.js

AssertionError 定义如下:

class AssertionError extends Error {
  constructor(options) {
    if (typeof options !== 'object' || options === null) {
      throw new exports.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object');
    }
    var { actual, expected, message, operator, stackStartFunction } = options;
    if (message) {
      super(message);
    } else {
      if (actual && actual.stack && actual instanceof Error)
        actual = `${actual.name}: ${actual.message}`;
      if (expected && expected.stack && expected instanceof Error)
        expected = `${expected.name}: ${expected.message}`;
      if (util === null) util = require('util');
      super(`${util.inspect(actual).slice(0, 128)} ` +
        `${operator} ${util.inspect(expected).slice(0, 128)}`);
    }

    this.generatedMessage = !message;
    this.name = 'AssertionError [ERR_ASSERTION]';
    this.code = 'ERR_ASSERTION';
    this.actual = actual;
    this.expected = expected;
    this.operator = operator;
    Error.captureStackTrace(this, stackStartFunction);
  }
}

如果我是你,我不会重新定义 AssertionError,这非常非常 hacky。我认为你最好的选择是将该类扩展为 MyAssertionError 或创建一个双胞胎而不是扩展错误。

希望有帮助!

于 2017-09-20T02:45:29.477 回答