扔摩卡咖啡的例外情况可能会在不应该的情况下进行测试



在我们的摩卡测试中,有时我们会出现错误并抛出例外,当抛出这些例外时,随后的断言不会被调用,即使有问题,我们的测试也可能通过。

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

我们尝试将其包装在尝试中,例如以下

  // 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案例隐藏了一些失败的断言信息。如果有人有任何建议,这将不胜感激。

示例中的测试不会通过。在摩卡咖啡中,如果测试中调用的函数引发异常,则测试将失败。示例:

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,因此将被摩卡咖啡捕获并显示为测试失败(执行确实不会达到断言,但测试将显示为失败(。

(。

我怀疑在您的情况下发生的事情是抛弃诺言或拒绝承诺,就像在这些示例之一中一样:

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)

两者都不会被测试捕获,因为该函数已执行成功返回承诺,并且测试块完成了,但故障发生后以后发生。如果您的功能返回承诺,则只需在测试中 await即可确保获得承诺结果:

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)

最新更新