最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

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

IT培训 admin 5浏览 0评论

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

控制器和测试方法:

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,打字稿

回答如下:

好吧,我想您的问题出在实例化和使用控制器与服务的方式上。让NestJs Testing utils为您完成工作,就像这样:

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

    beforeEach(async () => {
        // magic happens with the following line
        const module = await Test.createTestingModule({
            controllers: [
                PartsController
            ],
            providers: [
                PartsService
                //... any other needed import goes here
            ]
        })pile();

        partsService = module.get<PartsService>(PartsService);
        partsController = module.get<PartsController>(PartsController);
    });

    // The next 4 lines are optional and depends on whether you would need to perform these cleanings of the mocks or not after each tests within this describe section
    afterEach(() => {
        jest.restoreAllMocks();
        jest.resetAllMocks();
    });

    it('should be defined', () => {
        expect(partsController).toBeDefined();
        expect(partsService).toBeDefined();
    });

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

        jest.spyOn(partsService, 'findAll').mockImplementation(async (): Promise<Part[]> => Promise.resolve(result));

        const response = {
            json: (body?: any) => {},
            status: (code: number) => HttpStatus.OK,
        };

        expect(await partsController.getParts(response)).toBe(result);
      });
    }); 
});

我还没有亲自测试过代码,因此请尝试一下(不太确定“部件控制器”中“响应”类型的响应模拟)。关于部件控制器,您应该利用express的响应类型-尝试如下重写代码:

import { Controller, Get, Response, HttpStatus, Param, Body, Post, Request, Patch, Delete, Res } from '@nestjs/common';
import { Response } from 'express';

@Controller('api/parts')
export class PartController {
  constructor(private readonly partsService: partsService) { }

  @Get()
  public async getParts(@Response() res: Response) { // <= see Response type from express being used here
    const parts = await this.partsService.findAll();
    return res.status(HttpStatus.OK).json(parts);
  }
}

最后看看Nest官方文档的这一部分,也许它可以为您提供一些有关您要实现的目标的见解:-Nest testing section-Nest library approach

在第二个链接中,在页面的几乎开始处,在https://docs.nestjs/controllers#request-object部分中声明以下内容:

  • 为了与跨基础HTTP平台(例如Express和Fastify)的键入兼容,Nest提供@Res()和@Response()装饰。 @Res()只是@Response()的别名。两者都直接公开底层的本机平台响应对象接口。什么时候使用它们,您还应该导入基础的类型库(例如@ types / express)以充分利用。请注意您在方法处理程序中注入@Res()或@Response()嵌套到该处理程序的特定于库的模式,您将成为负责管理响应。这样做时,您必须发出通过对响应对象进行调用来进行某种响应(例如,res.json(...)或res.send(...)),否则HTTP服务器将挂起。

希望它有帮助,如果可以帮助您找到另一个解决方案,请随时发表评论或分享您的解决方案! :)

欢迎使用StackOverflow平台!

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

控制器和测试方法:

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,打字稿

回答如下:

好吧,我想您的问题出在实例化和使用控制器与服务的方式上。让NestJs Testing utils为您完成工作,就像这样:

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

    beforeEach(async () => {
        // magic happens with the following line
        const module = await Test.createTestingModule({
            controllers: [
                PartsController
            ],
            providers: [
                PartsService
                //... any other needed import goes here
            ]
        })pile();

        partsService = module.get<PartsService>(PartsService);
        partsController = module.get<PartsController>(PartsController);
    });

    // The next 4 lines are optional and depends on whether you would need to perform these cleanings of the mocks or not after each tests within this describe section
    afterEach(() => {
        jest.restoreAllMocks();
        jest.resetAllMocks();
    });

    it('should be defined', () => {
        expect(partsController).toBeDefined();
        expect(partsService).toBeDefined();
    });

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

        jest.spyOn(partsService, 'findAll').mockImplementation(async (): Promise<Part[]> => Promise.resolve(result));

        const response = {
            json: (body?: any) => {},
            status: (code: number) => HttpStatus.OK,
        };

        expect(await partsController.getParts(response)).toBe(result);
      });
    }); 
});

我还没有亲自测试过代码,因此请尝试一下(不太确定“部件控制器”中“响应”类型的响应模拟)。关于部件控制器,您应该利用express的响应类型-尝试如下重写代码:

import { Controller, Get, Response, HttpStatus, Param, Body, Post, Request, Patch, Delete, Res } from '@nestjs/common';
import { Response } from 'express';

@Controller('api/parts')
export class PartController {
  constructor(private readonly partsService: partsService) { }

  @Get()
  public async getParts(@Response() res: Response) { // <= see Response type from express being used here
    const parts = await this.partsService.findAll();
    return res.status(HttpStatus.OK).json(parts);
  }
}

最后看看Nest官方文档的这一部分,也许它可以为您提供一些有关您要实现的目标的见解:-Nest testing section-Nest library approach

在第二个链接中,在页面的几乎开始处,在https://docs.nestjs/controllers#request-object部分中声明以下内容:

  • 为了与跨基础HTTP平台(例如Express和Fastify)的键入兼容,Nest提供@Res()和@Response()装饰。 @Res()只是@Response()的别名。两者都直接公开底层的本机平台响应对象接口。什么时候使用它们,您还应该导入基础的类型库(例如@ types / express)以充分利用。请注意您在方法处理程序中注入@Res()或@Response()嵌套到该处理程序的特定于库的模式,您将成为负责管理响应。这样做时,您必须发出通过对响应对象进行调用来进行某种响应(例如,res.json(...)或res.send(...)),否则HTTP服务器将挂起。

希望它有帮助,如果可以帮助您找到另一个解决方案,请随时发表评论或分享您的解决方案! :)

欢迎使用StackOverflow平台!

发布评论

评论列表 (0)

  1. 暂无评论