#javascript #node.js #unit-testing #jestjs #private
#javascript #node.js #модульное тестирование #jestjs #Частное
Вопрос:
У меня есть www.js
файл в моей bin
папке. Которая отвечает за запуск моего серверного приложения.
const http = require('http');
const app = require('../app'); // This is my express application instance.
http.createServer(app).listen(process.env.SERVER_PORT || 3000);
Как вы можете видеть, здесь нет экспорта. узел запустит этот файл (cmd: node bin/www
), и мой сервер запустится. Однако в нем все еще есть некоторая логика, которую мне нужно протестировать.
Тестовые примеры, которые я, хотя:
- Он должен создать сервер с моим экземпляром express
- Он должен прослушиваться с порта 3000, если не указана переменная среды
- Он должен прослушивать порт, который предоставляется из переменной среды, если он указан.
Я использую jest
для своих тестов.
Поскольку этот файл ничего не экспортирует, я не могу импортировать его в тестовый файл jest. Как я могу протестировать сейчас?
Комментарии:
1. Это невозможно сделать. Это фундаментальная вещь для JS. Очевидное решение — исправить модуль для экспорта того, что вам нужно.
Ответ №1:
Решение для модульного тестирования:
www.js
:
const http = require('http');
const app = require('./app');
http.createServer(app).listen(process.env.SERVER_PORT || 3000);
app.js
:
const express = require('express');
const app = express();
module.exports = app;
www.test.js
:
const http = require('http');
const app = require('./app');
describe('64768906', () => {
afterEach(() => {
jest.resetModules();
});
afterAll(() => {
jest.restoreAllMocks();
});
it('should create server with my express instance and listen from port 3000', () => {
const server = { listen: jest.fn() };
const createServerSpy = jest.spyOn(http, 'createServer').mockReturnValue(server);
require('./www');
expect(createServerSpy).toBeCalledWith(app);
expect(server.listen).toBeCalledWith(3000);
});
it("should listen from port that is provided from environment variable if it's given.", () => {
const SERVER_PORT = process.env.SERVER_PORT;
process.env.SERVER_PORT = 4000;
const server = { listen: jest.fn() };
const createServerSpy = jest.spyOn(http, 'createServer').mockReturnValue(server);
require('./www');
expect(createServerSpy).toBeCalledWith(app);
expect(server.listen).toBeCalledWith('4000');
process.env.SERVER_PORT = SERVER_PORT;
});
});
результат модульного теста:
PASS src/stackoverflow/64768906/www.test.js (14.082s)
64768906
✓ should create server with my express instance and listen from port 3000 (12ms)
✓ should listen from port that is provided from environment variable if it's given. (22ms)
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
app.js | 100 | 100 | 100 | 100 | |
www.js | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 15.662s, estimated 17s
Комментарии:
1. ОП, почему вы не приняли этот ответ? Если это не сработало (в чем я сомневаюсь), пожалуйста, прокомментируйте, почему. Если это так, то принятие ответа поможет другим, кто прочитает этот вопрос в будущем.