Как протестировать частную, не экспортируемую функцию

#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. ОП, почему вы не приняли этот ответ? Если это не сработало (в чем я сомневаюсь), пожалуйста, прокомментируйте, почему. Если это так, то принятие ответа поможет другим, кто прочитает этот вопрос в будущем.