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应用编写详细的单元测试和集成测试。
当然,没问题!在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();
}
}
编写测试
现在,我们可以为CatsService
和CatsController
编写测试用例。
// 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
命令来执行测试了。