Бросив мокко, исключение может сделать тестовый зачет, когда это не должно - PullRequest
0 голосов
/ 26 июня 2019

В наших тестах 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
  });

Мы попытались обернуть это в попытку, как показано ниже

  // 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 скрыта некоторая информация об ошибочном утверждении. Если у кого-то есть какие-либо предложения, это будет оценено.

1 Ответ

1 голос
/ 26 июня 2019

Тест по вашему примеру не пройдет.В 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 throws TypeError, он будет перехвачен mocha и показан как неудачный тест (выполнение не достигнет утверждений действительноно тест все равно будет показан как проваленный.)

Я подозреваю, что в вашем случае происходит обещание или отказ от обещания, как в одном из следующих примеров:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...