首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jestJS/jestJS:如何拆分get()函数来编写简单的jest单元测试?

jestJS/jestJS:如何拆分get()函数来编写简单的jest单元测试?
EN

Stack Overflow用户
提问于 2018-10-16 19:17:20
回答 1查看 626关注 0票数 5

如何在expressJS应用程序中定义get()路由,以便进行简单的单元测试?

因此,作为第一步,我将get()的函数移到了自己的文件中:

index.js

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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 of expressJS中。

对于第二个问题:如果这是正确的方法,我不明白如何编写jestJS单元测试来检查是否调用了pwmWrite -这是一个异步函数的内部。

这是我的尝试,但我无法测试pwmWrite的内部调用:

代码语言:javascript
运行
复制
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()
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-23 07:04:34

你离我很近,只是错过了一些东西。

您需要在expect语句之前调用方法setStatusgetStatus,并且在req.queryres上缺少了模拟,因为getStatus使用它们。

代码语言:javascript
运行
复制
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进行模拟,因为它在那里使用

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52842582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档