Node.js中定义的AssertionError在哪里?

时间:2017-09-19 23:00:13

标签: node.js unit-testing assertion expect.js

我想让我的单元测试声明特定的函数调用在预期时特别抛出AssertionError,而不是它会抛出异常。断言库(expect)通过传递异常构造函数来支持这样的事情,但我似乎无法找到导出AssertionError构造函数的位置。它是否仅仅是一个内部课程而不是暴露给我们? The docs包含许多引用,但没有链接。

我有一种超级黑客的方式:

let AssertionError;

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

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

但我希望有更好的方法。

2 个答案:

答案 0 :(得分: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或创建一个双胞胎而不是扩展错误。

希望有所帮助!

答案 1 :(得分:0)

此处定义了断言错误类:

assert.AssertionError

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

assert.throws( FunctionThatShouldThrow_AssertionError, assert.AssertionError )