Контроллеры модульного тестирования используют Jest, NodeJS - PullRequest
1 голос
/ 02 апреля 2019

Я хочу проверить, чтобы определенные маршруты вызывали правильный контроллер, используйте Шут специфический (ложный или шпионский) .

Это особый случай для модульного тестирования. Кто-нибудь может помочь мне, как проверить это, используя шутку. Мне не нужно проверять вид ожидайте (код состояния или объект res) мне нужно проверить, был ли вызван controller . Спасибо!

Например:

// todoController.js
function todoController (req, res) {
    res.send('Hello i am todo controller')
} 

// index.spec.js
const express = require('express');
const request = require('request-promise');
const todoController = require('./todoController');
jest.mock('./todoController');

const app = express();

app.get('/todo', todoController)

test('If certain routes are calling the correct controller , controller should to have been called times one.', async() => {
    await request({url: 'http://127.0.0.1/todo'})
    expect(todoController).toHaveBeenCalledTimes(1);
})

1 Ответ

0 голосов
/ 17 июля 2019

На самом деле, если вы действительно ищете, там действительно много ссылок.

Далее я поделюсь несколькими известными мне способами.

Одним из главных концептуальных скачков в тестировании приложений Express с помощью имитации запроса / ответа является понимание того, как имитировать цепочку

API например. res.status(200).json({ foo: 'bar' }).

Сначала вы можете создать какой-нибудь перехватчик, это достигается возвращением экземпляра res из каждого из его методов:

// util/interceptor.js
module.exports = {
  mockRequest: () => {
    const req = {}
    req.body = jest.fn().mockReturnValue(req)
    req.params = jest.fn().mockReturnValue(req)
    return req
  },

  mockResponse: () => {
    const res = {}
    res.send = jest.fn().mockReturnValue(res)
    res.status = jest.fn().mockReturnValue(res)
    res.json = jest.fn().mockReturnValue(res)
    return res
  },
  // mockNext: () => jest.fn()
}

Экспресс API пользовательского пространства основан на промежуточном программном обеспечении. Промежуточное программное обеспечение, которое принимает в качестве параметров запрос (обычно называемый req), ответ (обычно называемый res) и следующий (вызов промежуточного программного обеспечения next).

И тогда у вас есть такой контроллер:

// todoController.js
function todoController (req, res) {
    if (!req.params.id) {
      return res.status(404).json({ message: 'Not Found' });
    }

    res.send('Hello i am todo controller')
}

Они используются при «подключении» к экземпляру приложения (приложения) Express (в app.js):

// app.js
const express = require('express');
const app = express();

const todoController = require('./todoController');

app.get('/todo', todoController);

Используя mockRequest и mockResponse, которые мы определили ранее, мы предположим, что res.send() вызывается с правильной полезной нагрузкой ({ data }).

Итак, в вашем тестовом файле:

// todo.spec.js
const { mockRequest, mockResponse } = require('util/interceptor')
const controller = require('todoController.js')

describe("Check method \'todoController\' ", () => {
  test('should 200 and return correct value', async () => {
    let req = mockRequest();
    req.params.id = 1;
    const res = mockResponse();

    await controller.todoController(req, res);

    expect(res.send).toHaveBeenCalledTimes(1)
    expect(res.send.mock.calls.length).toBe(1);
    expect(res.send).toHaveBeenCalledWith('Hello i am todo controller');
  });

  test('should 404 and return correct value', async () => {
    let req = mockRequest();
    req.params.id = null;
    const res = mockResponse();

    await controller.todoController(req, res);

    expect(res.status).toHaveBeenCalledWith(404);
    expect(res.json).toHaveBeenCalledWith({ message: 'Not Found' });
  });
});

Это всего лишь один подход к тестированию обработчиков Express и промежуточного программного обеспечения. Альтернатива - запустить сервер Express.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...