Nodejs Nestjs测试模块@nestjs/testing的使用

Nodejs Nestjs测试模块@nestjs/testing的使用
在NestJS中,[@nestjs](/user/nestjs)/testing是一个非常有用的库,它提供了一系列工具和函数来帮助你编写单元测试和集成测试。下面我将展示如何使用[@nestjs](/user/nestjs)/testing来测试一个简单的NestJS模块。

假设我们有一个简单的模块CatsModule,它包含一个控制器CatsController和一个服务CatsService

1. 创建模块、控制器和服务

首先,我们创建一个简单的模块、控制器和服务。

cats.module.ts

import { Module } from '[@nestjs](/user/nestjs)/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

cats.service.ts

import { Injectable } from '[@nestjs](/user/nestjs)/common';

@Injectable()
export class CatsService {
  private readonly cats: string[] = [];

  create(cat: string) {
    this.cats.push(cat);
  }

  findAll(): string[] {
    return this.cats;
  }
}

cats.controller.ts

import { Controller, Get, Post } from '[@nestjs](/user/nestjs)/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(cat: string) {
    this.catsService.create(cat);
  }

  @Get()
  findAll() {
    return this.catsService.findAll();
  }
}

2. 编写测试

接下来,我们将为这个模块编写一些基本的测试用例。

cats.module.spec.ts

import { Test, TestingModule } from '[@nestjs](/user/nestjs)/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

describe('CatsModule', () => {
  let module: TestingModule;

  beforeAll(async () => {
    module = await Test.createTestingModule({
      imports: [CatsModule], // 如果你的模块有导入其他模块,这里也需要导入
    }).compile();
  });

  it('should define cats service', () => {
    expect(module.get<CatsService>(CatsService)).toBeDefined();
  });

  it('should define cats controller', () => {
    expect(module.get<CatsController>(CatsController)).toBeDefined();
  });

  describe('when testing the controller', () => {
    let controller: CatsController;
    let service: CatsService;

    beforeEach(() => {
      controller = module.get<CatsController>(CatsController);
      service = module.get<CatsService>(CatsService);
    });

    it('should create a cat', () => {
      const catName = 'Garfield';
      controller.create(catName);
      expect(service.findAll()).toContain(catName);
    });

    it('should find all cats', () => {
      const cats = ['Tom', 'Jerry'];
      cats.forEach(cat => service.create(cat));
      expect(controller.findAll()).toEqual(cats);
    });
  });
});

解释

  • Test.createTestingModule:创建一个测试模块,可以在这里定义需要测试的服务和控制器。
  • module.compile():编译测试模块,使其准备好被测试。
  • module.get<T>():从测试模块中获取特定的类实例。
  • beforeEach:在每个测试用例之前执行的钩子函数,用于初始化变量。

通过这种方式,你可以为你的NestJS应用编写详细的单元测试和集成测试。


3 回复

当然,没问题!在NestJS中,@nestjs/testing模块是编写单元测试和集成测试的利器。让我们通过一个小例子来看看如何使用它。

首先,确保你已经安装了@nestjs/testing

npm install @nestjs/testing --save-dev

然后,假设我们有一个简单的服务CatsService,我们想要测试它的findAll方法:

// cats.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  findAll(): string[] {
    return ['cat1', 'cat2'];
  }
}

接下来,创建一个测试文件cats.service.spec.ts

// cats.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { CatsService } from './cats.service';

describe('CatsService', () => {
  let service: CatsService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [CatsService],
    }).compile();

    service = module.get<CatsService>(CatsService);
  });

  it('should return ["cat1", "cat2"]', () => {
    expect(service.findAll()).toEqual(['cat1', 'cat2']);
  });
});

这里,我们使用Test.createTestingModule来创建一个测试模块,并注入我们需要的服务。beforeEach钩子确保每次测试前都重新编译模块并获取服务实例。最后,我们简单地检查findAll方法是否返回预期的结果。

希望这能帮到你开始你的NestJS测试之旅!如果还有其他问题,随时问哦!


在NestJS中,@nestjs/testing模块提供了一套工具来帮助开发者进行单元测试和集成测试。下面我将展示如何使用这个模块来创建一个简单的测试。

首先,确保你的项目已经安装了@nestjs/testing模块。如果没有,可以通过以下命令安装:

npm install @nestjs/testing --save

接下来,我们将创建一个简单的控制器和服务作为示例,并编写对应的测试用例。

示例服务

假设我们有一个名为CatsService的服务,它包含了一个简单的函数用于获取猫的名字。

// cats.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class CatsService {
  private readonly cats: string[] = [];

  addCat(name: string) {
    this.cats.push(name);
  }

  getCats(): string[] {
    return this.cats;
  }
}

示例控制器

然后,我们创建一个控制器CatsController来处理与猫相关的HTTP请求。

// cats.controller.ts
import { Controller, Get, Post } from '@nestjs/common';
import { CatsService } from './cats.service';

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  addCat(name: string) {
    this.catsService.addCat(name);
    return { message: 'Cat added successfully' };
  }

  @Get()
  getCats() {
    return this.catsService.getCats();
  }
}

编写测试

现在,我们可以为CatsServiceCatsController编写测试用例。

// cats.service.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { CatsService } from './cats.service';

describe('CatsService', () => {
  let service: CatsService;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [CatsService],
    }).compile();

    service = module.get<CatsService>(CatsService);
  });

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

  it('should add a cat', () => {
    service.addCat('Tom');
    expect(service.getCats()).toEqual(['Tom']);
  });
});
// cats.controller.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

describe('CatsController', () => {
  let controller: CatsController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [CatsController],
      providers: [CatsService],
    }).compile();

    controller = module.get<CatsController>(CatsController);
  });

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

  it('should add a cat', async () => {
    const response = await controller.addCat('Jerry');
    expect(response.message).toBe('Cat added successfully');
    expect(controller['catsService'].getCats()).toEqual(['Jerry']);
  });

  it('should get all cats', async () => {
    controller['catsService'].addCat('Tom');
    controller['catsService'].addCat('Jerry');

    const result = await controller.getCats();
    expect(result).toEqual(['Tom', 'Jerry']);
  });
});

以上代码展示了如何使用@nestjs/testing模块来编写基本的单元测试。你可以根据需要扩展这些测试用例以覆盖更多的场景。

在NestJS中,使用@nestjs/testing模块可以方便地进行单元测试和集成测试。首先安装必要的包:

npm install --save @nestjs/testing jest @types/jest ts-jest

然后创建一个测试文件,例如app.e2e-spec.ts,并引入必要的模块:

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController (e2e)', () => {
  let app: TestingModule;

  beforeAll(async () => {
    app = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();
  });

  it('/ (GET)', async () => {
    const appController = app.get<AppController>(AppController);
    expect(await appController.getRootValue()).toBe('Hello World!');
  });
});

这样你就可以通过运行jest命令来执行测试了。

回到顶部