觉得增删改查也是有必要写一下测试用例的,而很多文档和视频的单测都是mock了typeorm或者其他很多东西,不太习惯那样。 我的方案就是用真实的数据库来测试(所以它不能叫单元测试),缺点自然就是会影响到数据库了,日后更好的方案可能是为测试单独配置一个数据库?
先记录下来模板代码
// user.service.ts
import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { Typeorm } from '../typeorm/typeorm.module';
describe('UserService', () => {
let service: UserService;
beforeAll(async () => {
const module: TestingModule = await Test.createTestingModule({
imports: [
Typeorm, // 这里是数据库连接
TypeOrmModule.forFeature([User]),
],
providers: [UserService],
}).compile();
service = module.get<UserService>(UserService);
});
it('should be defined', () => {
expect(service).toBeDefined();
});
// 第一步 清空表,同时也方便测clear
it('can clear user', async () => {
await service.clear();
const usersCount = (await service.findAll()).length;
expect(usersCount).toBe(0);
});
// 第二步 测创建逻辑
it('can create user', async () => {
const user = await service.create({ username: 'a0', password: 'a0' });
expect(user).toEqual({
id: 1, // 自增 所以一定是1
username: 'a0',
password: 'a0',
avatarUrl: null,
});
});
// 第三步 测查找逻辑
it('can findOne', async () => {
const user = await service.findOne(1);
expect(user.id).toBe(1);
});
// 第四步 测更新逻辑
it('can update user', async () => {
await service.update(1, { username: 'a00', password: 'a00' });
const user = await service.findOne(1);
expect(user).toEqual({
id: 1,
username: 'a00',
password: 'a00',
avatarUrl: null,
});
});
// 最后 再测删除逻辑
it('can remove user', async () => {
await service.remove(1);
const usersCount = (await service.findAll()).length;
expect(usersCount).toBe(0);
});
});