javascript - 抛出 mocha 异常可以使测试在不应该通过的情况下通过

标签 javascript unit-testing mocha.js

在我们的 Mocha 测试中,有时我们会遇到错误并抛出异常,当抛出这些异常时,后续的断言不会被调用,即使出现问题,我们的测试也可能会通过。

  // this would pass
  it('adsf', async () => {
    assert.equal(1,1)
    var foo = undefined;
    foo.hi(); // throw exception
    assert.equal(1,2) // assert not called
  });

我们尝试将其包装在 try catch 中,如下所示

  // this would fail, but not say why
  it('adsf', async () => {
    try {
      assert.equal(1,1)
      // var foo = undefined;
      // foo.hi();
      assert.equal(1,2)
    } catch (err) {
      assert.fail(err) // if fail, such as the 1,2 case above, the line number of the error is not shown
    }
  });

但是catch案例隐藏了一些失败的断言信息。如果有人有任何建议,我们将不胜感激。

最佳答案

您的示例中的测试将不会通过。在 mocha 中,如果测试中调用的函数抛出异常,测试就会失败。示例:

const assert = require('assert');

function foo() {
  throw new Error('err');
}

describe('test', () => {
  it('works', async () => {
    foo();
    console.log('came here');
  });
});
$ npx mocha test.js

  test
    1) works

  0 passing (6ms)
  1 failing

  1) test
       works:
     Error: err
      at foo (test.js:8:9)
      at Context.<anonymous> (test.js:13:11)
      at processImmediate (internal/timers.js:439:21)

因此,在您的示例中,由于 foo.hi 抛出 TypeError,它会被 mocha 捕获并显示为测试失败(执行不会到达断言)确实如此,但无论如何测试都会显示为失败)。

我怀疑在你的情况下发生的是抛出一个 promise 或拒绝一个 promise ,就像下面的例子之一:

function throwing() {
  return new Promise((resolve, reject) => { throw new Error('err'); });
}

function rejecting() {
  return new Promise((resolve, reject) => { reject(new Error('err')); });
}

describe('test', () => {
  it('works', async () => {
    throwing();
    rejecting();
    console.log('came here');
  });
});
$ npx mocha test.js

  test
came here
    ✓ works

[some UnhandledPromiseRejectionWarnings here]

  1 passing (6ms)

两者都不会被测试捕获,因为函数执行成功返回一个 Promise 并且测试 block 完成,但稍后会发生失败。如果您的函数返回一个 Promise,只需在测试中await 即可确保获得 Promise 结果:

describe('test', () => {
  it('works', async () => {
    await throwing();
    await rejecting();
    console.log('came here');
  });
});
$ npx mocha test.js 

  test
    1) works

  0 passing (6ms)
  1 failing

  1) test
       works:
     Error: err
      at test.js:4:51
      at new Promise (<anonymous>)
      at throwing (test.js:4:10)
      at Context.<anonymous> (test.js:13:11)
      at processImmediate (internal/timers.js:439:21)

关于javascript - 抛出 mocha 异常可以使测试在不应该通过的情况下通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762035/

相关文章:

javascript - 使用 PHP 从另一个页面获取内容

javascript - 使用 javascript 切片数组创建卡片

javascript - CSP : How to allow unsafe-eval for a given URI prefix (Firefox)

javascript - 尝试通过 mocha 调试程序(使用 --debug-brk)调试 mocha 本身

node.js - 在本地主机上测试 API 请求

javascript - 对于 Array,在 javascript 中使用 map() 和 reduce() 而不是 forEach() 效率更高吗?

unit-testing - 单元测试日期 - 如果不是工作日

c++ - 单元测试 .cpp 操作方法

javascript - 如何在 mocha 测试中获取 sails 应用程序的运行时 url

objective-c - OCMock 模拟协议(protocol)的静态类方法。