Published on

How to mock express middleware in Jest

Authors
  • avatar
    Name
    Saad Bash

Let's say we have hello-world express app, which uses middleware to log time with every request.

// app.js File
const express = require('express')
const app = express()
const logTime = require('./middleware')

app.use(logTime) // <=== Log time

app.get('/', (req, res) => {
  res.send('Hello World!')
})

module.exports = app
// middleware.js
const logTime = (req, res, next) => {
  console.log('Time:', new Date().toLocaleString())
  next()
}

module.exports = logTime
// server.js File
const port = 8080
const app = require('./app')

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

When app is run and get request made on http:localhost:8080, Time would be logged in terminal.

Mocking middleware

// app.test.js
const request = require('supertest')
const app = require('./app')
const logTime = require('./middleware')

jest.mock('./middleware', () =>
  jest.fn((_, __, next) => {
    console.log('🤩 Log from mock function')
    return next()
  })
)

test('should mock middleware func', async () => {
  await request(app).get('/').expect(200)
  expect(logTime).toBeCalledTimes(1)
})

After the test is run, time won't be logged, but we'd see 🤩 Log from mock function in terminal:

  console.log
    🤩 Log from mock function

      at log (app.test.js:7:11)

 PASS  ./app.test.js
  ✓ should mock middleware func (31 ms)