#node.js #unit-testing #mocha.js #chai #mockgoose
#node.js #модульное тестирование #mocha.js #чай #mockgoose
Вопрос:
Я получаю тайм-аут при выполнении модульных тестов с Mocha
, Chai
и Mockgoose
У меня есть функция Assessment.NewAssessment(assessmentDetails)
, которая сохранит оценку в БД.
ПРИМЕЧАНИЕ: `Оценка.NewAssessment возвращает обещание (это асинхронная функция)
Вот что я сделал до сих пор:
require('assert');
let chai = require('chai');
let chaiAsPromised = require("chai-as-promised");
chai.use(chaiAsPromised);
let expect = chai.expect;
let Assessment = require('../models/Assessment');
let CustomError = require('../CustomError');
let mongoose = new (require('mongoose').Mongoose)();
let Mockgoose = require('mockgoose').Mockgoose;
let mockgoose = new Mockgoose(mongoose);
before(function (done) {
mockgoose.prepareStorage().then(async function () {
mongoose.connect(
'mongodb://127.0.0.1/' process.env.DB_NAME '_test?replicaSet=rs0',
{useNewUrlParser: true},
function (err) {
done(err);
});
});
});
describe('Class Assessment', function () {
describe('Function GetAll', function () {
it('Throw an error with code 400 for non-object parameters', () => {
return expect(Assessment.GetAll('test'))
.to.be.eventually.rejectedWith(CustomError)
.and.have.property('code', 400);
});
it('Successfully creating an assessment', async () => {
let assessmentDetails = {
name: 'test',
createdBy: mongoose.Types.ObjectId(),
};
let assessment = await Assessment.NewAssessment(assessmentDetails)
return expect(assessment).to.be.an('object');
});
});
});
В Assessment.js
:
static async NewAssessment(assessmentDetails) {
if (!assessmentDetails || typeof assessmentDetails !== 'object') {
throw new CustomError('assessmentDetails is not defined.', HttpStatus.BAD_REQUEST);
}
return await new Assessment(assessmentDetails).save();
}
Результат выполнения mocha --timeout 120000
:
Error: Timeout of 120000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
Что я здесь делаю не так?
Комментарии:
1. Где это заканчивается? На каком этапе?
2. Первый тест проходит правильно, он останавливается на втором тесте, вызов функции
Assessment.NewAssessment(assessmentDetails)
3. Я не могу выполнить ваш код и протестировать его, поэтому в качестве непроверенного предложения я бы сказал, попробуйте удалить
return
из этой функции и вызватьdone()
послеexpect
инструкции. Кроме того, вы возвращаете обещаниеNewAssessment
?4. Это асинхронная функция, я добавлю ее в вопрос
5. Я пытался использовать
done()
то же самое, тайм-аут
Ответ №1:
Я не знаю почему, но с этим:
it('Successfully creating an assessment', async () => {
let assessmentDetails = {
name: 'test',
createdBy: mongoose.Types.ObjectId(),
};
return expect(Assessment.NewAssessment(assessmentDetails))
.to.be.eventually.an('object');
);
Он работает нормально.