#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. Важным моментом в первом примере этого ответа является то, что он возвращает обещание. Я не уловил этого в первый раз, когда прочитал это.