Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Тестирование приложения с асинхронной инициализацией (https://javascript.ru/forum/node-js-io-js/79644-testirovanie-prilozheniya-s-asinkhronnojj-inicializaciejj.html)

sniffysko 03.03.2020 18:17

Тестирование приложения с асинхронной инициализацией
 
Здравствуйте. Есть желание написать тестов на свое приложение. Имеется главный файл приложения:
const express = require('express');
const sanitizer = require('express-sanitizer');
const config = require('./class/config');
const app = express();

const MSG = require('./class/message').getInstance('ru');
const LOG = require('./class/logger');
const sql = require('./class/appsql');
const apputil = require('./class/apputil');
const RouteRegistrator = require('./class/routeregistrator');

// Настраиваем обработку роутами JSON и фильтруем скрипты из запросов
app.use(express.json());
app.use(express.urlencoded({extended: true}));
// app.use(sanitizer());
app.use(apputil.setHeaders);

// Асинхронная инициализация приложения
(async () => {
	// Инициализируем приложение
	await initApp();
	// Запускаем сервер
	await initPort();
})();


async function initApp() {
	// Инициализируем SQL и читаем настройки приложения
	await sql.init();
	await sql.loadPreferences();
	// Регистрируем роуты
	const reg = new RouteRegistrator(app);
	reg.register();

	// Глобальный обработчик ошибок.
	apputil.initGlobalErrorHandler(app, LOG);
}


async function initPort() {
	const port = process.env.PORT || config.getKey('apiPort');
	const resInit = new Promise(resolve => {
		app.listen(port, (err, req, res) => {
			const msg = "Application started at port: " + port;
			LOG.logInfo(msg);
			resolve(msg);
		});
	});
	await resInit;
}

module.exports.app = app;


И файл для тестирования компонента:

process.env.NODE_ENV = 'test';
process.env.PORT = 3333;

const app = require('./../../../apia');
const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;
chai.use(chaiHttp);


describe("Bullet description", (done) => {
	let moduleRoute = '/bullet',
		newId = -1

	const dataNormal = {
		name: "Test bullet description",
		code: "test Bullet description Code1"
	}

	it("Create bullet NORMAL", (done) => {
		chai.request(app)
			.post(moduleRoute)
			.send(dataNormal)
			.end((err, res) => {
				expect(err).to.be.null;
				expect(res).to.have.status(200);
				expect(res).to.be.a('object');
				expect(res.body).to.haveOwnProperty('id');
				if(res.body.id) newId = res.body.id;
				console.log("insert END = ", newId);
				done();
			});
	});

});


Как и следовало ожидать, тестирование начинается до того, как приложение проинициализируется.
Не подскажете каким способом разруливают какую проблему?
Если использовать before, то мой вариант не подходит. Модуль уже начал инициализироваться и. По идее, тогда надо не надо подключать приложение, а в каждем модуле проводить асинхронную инициализацию компонентов приложения? 100 модулей = 100 инициализаций, 100 коннектов к БД?


Часовой пояс GMT +3, время: 15:49.