nest.js + typeorm 增删改查的集成测试

180 阅读1分钟

觉得增删改查也是有必要写一下测试用例的,而很多文档和视频的单测都是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);
  });
});