В настоящее время я делаю небольшой сервер на JavaScript и в процессе обучения пишу модульные тесты для функций. К сожалению, я столкнулся с большими трудностями с определенным тестом, который выполняет обещание. Ниже представлен модуль маршрутизатора с отдельной функцией handlePUT для удобства тестирования.
const express = require('express');
const service = require('../service/user.service');
const dutyStatusRouter = express.Router();
const output = console;
function handlePUT(req, res) {
service.updateUserStatus()
.then((fulfilled) => {
res.status(fulfilled);
res.send();
})
.catch(() => {
res.status(500);
res.send();
});
}
dutyStatusRouter.route('/').put(handlePUT);
Функция updateUserStatus в основном переключает логическое значение в базе данных и выглядит примерно так:
function updateUserStatus() {
return new Promise((resolve, reject) => {
if (…) {
resolve(201);
} else if (…) {
resolve(200);
} else {
reject();
}
});
}
Что касается модульных тестов, я использую mocha / chai с proxyquire для создания фиктивного updateUserStatus.
const chai = require('chai');
const sinon = require('sinon');
const proxyquire = require('proxyquire');
const serviceStub = {};
describe('=== Unit test ===', () => {
it('Handle PUT test: promise kept', async () => {
const dutyStatusRouter = proxyquire('../../router/duty-status.router', {
'../service/user.service': serviceStub,
});
serviceStub.updateUserStatus = () => {
return new Promise((resolve, reject) => {
resolve(200);
});
};
const res = {
status: sinon.fake(),
send: sinon.fake(),
};
await dutyStatusRouter.handlePUT({}, res);
chai.assert(res.status.calledOnceWith(200));
});
});
Всякий раз, когда я пытаюсь запустить модульный тест, я получаю ошибку Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
. Если я попытаюсь добавить done()
, он все равно потерпит неудачу, сообщив об ошибке Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both.