使用请求对 NestJS 控制器进行单元测试

mgo*_*mgo 5 unit-testing express nestjs

我的控制器函数定义如下所示: async login(@Req() request, @Body() loginDto: LoginDto): Promise<any> {

我如何准备/模拟请求以提供来自 Jest 测试的函数的第一个参数?在函数内部,我正在使用request.res.set. 我应该以某种方式将真实的 Request 对象传递给函数,然后检查是否设置了标头,或者模拟整个 Request 对象并检查是否调用了 set 函数?

mgo*_*mgo 8

我设法使用node-mocks-http库来模拟请求和响应。

const req = mocks.createRequest() req.res = mocks.createResponse()

然后将其作为参数传递。

const data = await authController.login(req, loginDto) expect(req.res.get('AccessToken')).toBe(token.accessToken)


Rub*_*cía 6

我采用了不同的方法,node-mocks-http我没有使用库,而是使用了@golevelup/ts-jest,也没有测试函数是否返回某个值,例如res.json()or res.status(),而是检查了该函数是否是用我想要的值调用的。

我从Kent C. Dodds 的测试研讨会借用了这种方法,看看是否有类似的想法。不管怎样,这就是我为了我的依赖性mock所做的:ResponseController's route

  // cars.controller.spec.ts
  import { createMock } from '@golevelup/ts-jest';

  const mockResponseObject = () => {
    return createMock<Response>({
      json: jest.fn().mockReturnThis(),
      status: jest.fn().mockReturnThis(),
    });
  };


  ... ommited for brevity

  it('should return an array of Cars', async () => {
    const response = mockResponseObject();

    jest
      .spyOn(carsService, 'findAll')
      .mockImplementation(jest.fn().mockResolvedValueOnce(mockedCarsList));

    await carsController.getCars(response);

    expect(response.json).toHaveBeenCalledTimes(1);
    expect(response.json).toHaveBeenCalledWith({ cars: mockedCarsList });
    expect(response.status).toHaveBeenCalledTimes(1);
    expect(response.status).toHaveBeenCalledWith(200);
  });

Run Code Online (Sandbox Code Playgroud)

就是这样,我认为实现细节并不那么重要,但无论如何我都会保留Github 存储库的链接,您可以在其中找到整个项目。

  • `@golevelup/ts-jest` 是为了解决这样的问题而创建的 (2认同)