Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用从控制器返回的值?在NestJs上测试控制器_Node.js_Unit Testing_Testing_Nestjs_Sequelize Typescript - Fatal编程技术网

Node.js 如何使用从控制器返回的值?在NestJs上测试控制器

Node.js 如何使用从控制器返回的值?在NestJs上测试控制器,node.js,unit-testing,testing,nestjs,sequelize-typescript,Node.js,Unit Testing,Testing,Nestjs,Sequelize Typescript,控制器和测试方法: import { Controller, Get, Response, HttpStatus, Param, Body, Post, Request, Patch, Delete, Res } from '@nestjs/common'; @Controller('api/parts') export class PartController { constructor(private readonly partsService: partsService) { }

控制器和测试方法:

import { Controller, Get, Response, HttpStatus, Param, Body, Post, Request, Patch, Delete, Res } from '@nestjs/common';
@Controller('api/parts')
export class PartController {
  constructor(private readonly partsService: partsService) { }

  @Get()
  public async getParts(@Response() res: any) {
    const parts = await this.partsService.findAll();
    return res.status(HttpStatus.OK).json(parts);
  }
}
这是单元测试,必须测试getParts方法:

describe('PartsController', () => {
  let partsController: PartsController;
  let partsService: partsService;

  beforeEach(async () => {
    partsService = new partsService(Part);
    partsController= new PartsController(partsService);
  });

  describe('findAll', () => {
    it('should return an array of parts', async () => {
      const result = [{ name: 'TestPart' }] as Part[];

      jest.spyOn(partsService, 'findAll').mockImplementation(async () => result);

      const response = {
        json: (body?: any) => {
          expect(body).toBe(result);
        },
        status: (code: number) => response,
      };

      await partsController.getParts(response);
    });
  });
});
这个测试工作正常,但我认为这是一个糟糕的解决方案。当我调查这个问题时,我看到了这个选项:

const response = {
  json: (body?: any) => {},
  status: (code: number) => response,
};
expect(await partsController.getParts(response)).toBe(result);
但是当我尝试它时,我的测试不起作用,因为等待partsController.getParts(response)//未定义 那么,我该怎么做才能让我的测试看起来不错呢


在我使用的解决方案中:nodeJS sequelize、nestJS、typescript

好吧,所以我想您的问题在于实例化和使用控制器和服务的方式。
让我们为你做这项工作,就像这样:

description('Parts Controller',()=>{
让零件控制器:零件控制器;
让零件服务:零件服务;
beforeach(异步()=>{
//魔术发生在下面的一行
const module=await Test.createTestingModule({
控制器:[
零件控制器
],
供应商:[
零件服务
//…任何其他需要的输入都在这里
]
}).compile();
partsService=module.get(partsService);
partsController=module.get(partsController);
});
//接下来的4行是可选的,取决于您是否需要在本节中的每个测试之后执行模拟的这些清理
之后(()=>{
开玩笑。恢复记忆();
jest.resetAllMocks();
});
它('应该定义',()=>{
expect(partsController).toBeDefined();
expect(partsService).tobededefined();
});
描述('findAll',()=>{
它('应该返回一个部件数组',async()=>{
常量结果:Part[]=[{name:'TestPart'}];
spyOn(partsService,'findAll').mockImplementation(异步():Promise=>Promise.resolve(结果));
常数响应={
json:(body?:any)=>{},
状态:(代码:number)=>HttpStatus.OK,
};
expect(等待partsController.getParts(响应)).toBe(结果);
});
}); 
});
我还没有亲自测试代码,所以请尝试一下(不太确定Parts Controller tho中响应类型的响应模拟)。
关于部件控制器,您应该利用express中的响应类型-尝试按如下方式重写代码:

import{Controller,Get,Response,HttpStatus,Param,Body,Post,Request,Patch,Delete,Res}从'@nestjs/common'导入;
从“express”导入{Response};
@控制器(“api/部件”)
导出类PartController{
构造函数(私有只读partsService:partsService){}
@得到()

public async getParts(@Response()res:Response){//您有什么理由希望注入响应并自己管理它,而不是让Nest为您处理它吗?我正在遵循您的解决方案,但我一直得到
类型“{json:(body?:User[])=>void;状态:(code:number)=>HttpStatus;}“”缺少类型“Response”中的以下属性:sendStatus、links、send、jsonp和78个以上的属性
。如何避免包含
Response
的所有参数?@asus您有没有一个解决方案,可以尝试将模拟对象包装为
作为Response
,这样TypeScript就不会因为缺少道具而哭泣最终不需要用于测试目的?我也遇到了这个问题,如果您将部分作为
和任何作为响应键入
,那么您将得到类型错误消失。从