单元测试控制器使用Jest,NodeJS

时间:2019-04-01 21:33:42

标签: javascript node.js unit-testing express jestjs

我想检查某些路由使用正确的玩笑(模拟或间谍)调用特定控制器的情况。

是特定于单元测试的情况。有人可以帮助我如何检查它的玩笑。我不需要验证 期望(状态代码或res对象),我需要检查是否已调用 controller 。 谢谢!

例如:

sqrt(n)

1 个答案:

答案 0 :(得分:0)

实际上,如果您确实进行搜索,那么确实有很多参考文献。

下面,我分享一些我所知道的方式。

使用模拟的请求/响应测试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()
}

Express用户界面API基于中间件。一种以请求(通常称为req),响应(通常称为res)和下一个(称为下一个中间件)作为参数的中间件。

然后您将拥有这样的控制器:

// 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);

使用我们之前定义的模拟请求和模拟响应,然后假设使用正确的有效负载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服务器。