使用请求对 NestJS 控制器进行单元测试
Unit testing NestJS controller with request
我的控制器函数定义如下所示:
async login(@Req() request, @Body() loginDto: LoginDto): Promise<any> {
我怎么能prepare/mockup请求提供来自 Jest 测试的函数的第一个参数?
在函数内部,我使用 request.res.set
设置 headers。我应该以某种方式将真实请求 object 传递给函数然后检查是否设置了 header 还是模拟整个请求 object 并检查是否调用了设置函数?
我设法使用 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)
我采用了不同的方法,而不是使用 node-mocks-http
库,我使用 @golevelup/ts-jest,而且,而不是测试函数 returns 是否有一些值,比如 res.json()
或 res.status()
,我检查了是否使用我想要的值调用了该函数。
我借鉴了Kent C. Dodds's testing workshop的这个方法,看看有没有类似的思路。无论如何,这就是我为了 mock
我的 Controller's route
:
的 Response
依赖所做的
// 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);
});
就是这样,我认为实施细节并不那么重要,但无论如何我都会将 link 留给 Github repo,您可以在其中找到整个项目。
我的控制器函数定义如下所示:
async login(@Req() request, @Body() loginDto: LoginDto): Promise<any> {
我怎么能prepare/mockup请求提供来自 Jest 测试的函数的第一个参数?
在函数内部,我使用 request.res.set
设置 headers。我应该以某种方式将真实请求 object 传递给函数然后检查是否设置了 header 还是模拟整个请求 object 并检查是否调用了设置函数?
我设法使用 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)
我采用了不同的方法,而不是使用 node-mocks-http
库,我使用 @golevelup/ts-jest,而且,而不是测试函数 returns 是否有一些值,比如 res.json()
或 res.status()
,我检查了是否使用我想要的值调用了该函数。
我借鉴了Kent C. Dodds's testing workshop的这个方法,看看有没有类似的思路。无论如何,这就是我为了 mock
我的 Controller's route
:
Response
依赖所做的
// 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);
});
就是这样,我认为实施细节并不那么重要,但无论如何我都会将 link 留给 Github repo,您可以在其中找到整个项目。