use*_*695 5 javascript unit-testing express jestjs
如何在expressJS应用程序中定义get()路由,以便进行简单的单元测试?
因此,作为第一步,我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))
Run Code Online (Sandbox Code Playgroud)
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
}
}
Run Code Online (Sandbox Code Playgroud)
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)
}
Run Code Online (Sandbox Code Playgroud)
所以首先我不太确定,如果我正确地拆分代码 - 考虑进行单元测试.
对我来说,通过调用必须完成的唯一事情/set-status?id=1&value=50是调用pwmWrite()(我猜)对象,该对象由expressJS 定义new Gpio并存储在locals其中.
而对于第二种:如果这应该是正确的方法,我不明白如何编写一个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()
})
Run Code Online (Sandbox Code Playgroud)
你们非常接近,只是缺少一些东西。
您需要在期望语句之前调用方法setStatusand getStatus,并且您缺少对req.queryand 的模拟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();
});
Run Code Online (Sandbox Code Playgroud)
在 require 之前需要getStatus进行模拟setStatus,因为它在那里使用
| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |