expressJS / jestJS: Как разделить функцию get () для написания простого jest-теста? - PullRequest
0 голосов
/ 16 октября 2018

Как определить маршрутизацию get () в приложении expressJS с намерением выполнить простое модульное тестирование?

Итак, в качестве первого шага я переместил функцию get() в собственный файл:

index.js

const express = require('express')
const socketIo = require('socket.io')
const Gpio = require('pigpio').Gpio

const app = express()
const server = http.createServer(app)
const io = socketIo(server)

const setStatus = require('./lib/setStatus.js')

app.locals['target1'] = new Gpio(1, { mode: Gpio.OUTPUT })

app.get('/set-status', setStatus(app, io))

lib / setStatus.js

const getStatus = require('./getStatus.js')

module.exports = (app, io) => {
  return (req, res) => {
    const { id, value } = req.query // id is in this example '1'
    req.app.locals['target' + id].pwmWrite(value))
    getStatus(app, io)
    res.send({ value }) // don't need this
  }
}

lib / getStatus.js

const pins = require('../config.js').pins

module.exports = async (app, socket) => {
  const res = []
  pins.map((p, index) => {
    res.push(app.locals['target' + (index + 1)].getPwmDutyCycle())
  })
  socket.emit('gpioStatus', res)
}

Итак, во-первых, я не совсем уверен, правильно ли я разделил этот код - думал о проведении модульного тестирования.

Для меня единственное, что имеетсделать это путем вызова /set-status?id=1&value=50 - это вызвать pwmWrite() для (я предполагаю) объекта, который определяется new Gpio и хранится в locals файла expressJS.

И для второго: Еслиэто должен быть правильный путь, я не понимаю, как написать модульный тест jestJS, чтобы проверить, был ли вызван pwmWrite, который находится внутри асинхронной функции.

Это моя попытка, но я могуне проверять внутренний вызов pwmWrite:

test('should call pwmWrite() and getStatus()', async () => {
  const app = {}
  const io = { emit: jest.fn() }
  const req = {
    app: {
      locals: {
        target1: { pwmWrite: jest.fn() }
        }
      }
    }
  }
  expect.assertions(1)
  expect(req.app.locals.target1.pwmWrite).toHaveBeenCalled()
  await expect(getStatus(app, io)).toHaveBeenCalled()
})

1 Ответ

0 голосов
/ 23 октября 2018

Вы очень близки, просто упускаете несколько вещей.

Вам нужно вызывать методы setStatus и getStatus до ожидаемых операторов, и вы пропускаете насмешки над req.query и res, поскольку getStatus использует их.

test('should call pwmWrite() and getStatus()', async () => {
  const app = {}
  const io = {};
  const req = {
    query: {
      id: '1',
      name: 'foo'
    },
    app: {
      locals: {
          target1: { pwmWrite: jest.fn() }
      }
    }
  };
  const res = { send: jest.fn() };

  // Mock getStatus BEFORE requiring setStatus
  jest.mock('./getStatus');

  //OBS Use your correct module paths
  const setStatus = require('./setStatus');
  const getStatus = require('./getStatus');


  // Call methods
  setStatus(app, io)(req, res);

  expect.assertions(2);

  // Get called in setStatus
  expect(req.app.locals.target1.pwmWrite).toHaveBeenCalled();

  // See if mocked getStatus has been called
  await expect(getStatus).toHaveBeenCalled();
});

getStatus необходимо смоделировать, прежде чем потребовать setStatus, так как он используется там

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