首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >抛出mocha异常可以使测试通过,而不应该这样做。

抛出mocha异常可以使测试通过,而不应该这样做。
EN

Stack Overflow用户
提问于 2019-06-26 05:09:32
回答 1查看 400关注 0票数 0

在我们的mocha测试中,有时我们有bug和抛出异常,当这些异常被抛出时,后续的断言不会被调用,我们的测试可能会通过,即使有一些错误。

代码语言:javascript
复制
  // 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中,如下所示

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-26 11:01:36

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

代码语言:javascript
复制
const assert = require('assert');

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

describe('test', () => {
  it('works', async () => {
    foo();
    console.log('came here');
  });
});
代码语言:javascript
复制
$ 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捕获并显示为测试失败(执行实际上不会到达asserts,但无论如何测试都会显示为失败)。

我怀疑在你的案例中会发生的是抛出一个承诺或拒绝一个承诺,就像下面的例子之一:

代码语言:javascript
复制
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');
  });
});
代码语言:javascript
复制
$ npx mocha test.js

  test
came here
    ✓ works

[some UnhandledPromiseRejectionWarnings here]

  1 passing (6ms)

这两者都不会被测试捕获,因为函数成功执行时返回了promise,测试块也完成了,但失败发生在以后。如果您的函数返回promise,只需在测试中对其执行await,以确保获得promise结果:

代码语言:javascript
复制
describe('test', () => {
  it('works', async () => {
    await throwing();
    await rejecting();
    console.log('came here');
  });
});
代码语言:javascript
复制
$ 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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56762035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档