Ошибка тайм-аута Mocha Chai при сбое инструкции ‘expect’

#node.js #mocha.js #chai

#node.js #mocha.js #чай

Вопрос:

Я получаю неожиданное поведение тайм-аута, используя инструкцию Mocha and Chai ‘expect’, когда тест завершается неудачно.

Кодекс:

 require('./lib/test-env.js');

const expect = require('chai').expect;
const estimateQuery = require('../lib/estimate-query-helper.js');

describe('testing auth routes', function() {
  describe('testing estimate query helper', function() {
    it('should return an average daily rate and occupancy rate', (done) => {
      estimateQuery.getEstimate()
      .then(result => {
        expect(result[0]['avg(`Average Daily Rate`)']).to.be.a('number');
        expect(result[0]['avg(`Occupancy Rate LTM`)']).to.be.a('number');
        done();
      });
    });
  });
});
 

Когда я запускаю это с правильными ожидаемыми значениями, тест проходит без тайм-аута (и я проверил, чтобы все возвращенные значения были правильными). Но когда я меняю ‘number’ на (например) ‘string’ в любом из операторов, вместо сбоя и выдачи ошибки ‘Expected …, Actual …», время ожидания истекает. Я просмотрел документы и открытые вопросы Chai и не могу найти ответа.

Заранее большое спасибо за вашу помощь.

Ответ №1:

Это потому, что обещание улавливает ошибку, вызванную ошибочным ожиданием, в результате done чего обратный вызов не вызывается.

Mocha понимает обещания, поэтому вы можете вернуть обещание вместо использования обратного вызова:

 describe('testing auth routes', function() {
  describe('testing estimate query helper', function() {
    it('should return an average daily rate and occupancy rate', () => {
      return estimateQuery.getEstimate()
        .then(result => {
          expect(result[0]['avg(`Average Daily Rate`)']).to.be.a('number');
          expect(result[0]['avg(`Occupancy Rate LTM`)']).to.be.a('number');
        });
    });
  });
});
 

Любые неверные ожидания приведут к отклонению обещания и сообщению о тестировании как о сбое.

В качестве альтернативы, вы могли бы придерживаться done обратного вызова и добавить catch :

 describe('testing auth routes', function() {
  describe('testing estimate query helper', function() {
    it('should return an average daily rate and occupancy rate', (done) => {
      estimateQuery.getEstimate()
        .then(result => {
          expect(result[0]['avg(`Average Daily Rate`)']).to.be.a('number');
          expect(result[0]['avg(`Occupancy Rate LTM`)']).to.be.a('number');
          done();
        })
        .catch(done);
    });
  });
});
 

Комментарии:

1. Ах, это имеет смысл, спасибо! Забыл, что мокко делает это так просто. Очень признателен.

2. Важным моментом в первом примере этого ответа является то, что он возвращает обещание. Я не уловил этого в первый раз, когда прочитал это.