testing - 使用 TypeORM 和 Nestjs 进行测试的过程,以及使用 mocks 开玩笑的过程?

标签 testing tdd nestjs typeorm

这个问题可能会概括为服务中的 stub 存储库,以及如何在这个问题的上下文中正确测试和提供覆盖。

我正在学习更多关于测试的知识,但一直对如何正确执行涉及数据库的测试感到困惑。

我有一个定义列和一些初始验证逻辑的用户实体。

    import { IsAlphanumeric, IsEmail, MinLength } from 'class-validator';
    import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
    @Entity()
    export class User {
      @PrimaryGeneratedColumn()
      public id!: number;

      @Column()
      public name!: string;

      @IsEmail()
      @Column()
      public email!: string;

      @MinLength(8)
      @Column()
      public password!: string;
    }

我有一个 UserService,它为实体注入(inject)存储库。

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { validateOrReject } from 'class-validator';
    import { Repository } from 'typeorm';
    import { CreateUserDTO } from './dto/create-user.dto';
    import { User } from './user.entity';

    @Injectable()
    export class UserService {
      constructor(
        @InjectRepository(User) private readonly userRepository: Repository<User>
      ) {}

      public async create(dto: CreateUserDTO) {
        const user = this.userRepository.create(dto);
        await validateOrReject(user);
        await this.userRepository.save(user);
      }

      public async findAll(): Promise<User[]> {
        return await this.userRepository.find();
      }

      public async findByEmail(email: string): Promise<User | undefined> {
        return await this.userRepository.findOne({
          where: {
            email,
          },
        });
      }
    }

这是我的初步测试,所以你可以跟随我的思路......

    import { Test, TestingModule } from '@nestjs/testing';
    import { getRepositoryToken } from '@nestjs/typeorm';
    import { User } from './user.entity';
    import { UserService } from './user.service';

    const createMock = jest.fn((dto: any) => {
      return dto;
    });

    const saveMock = jest.fn((dto: any) => {
      return dto;
    });

    const MockRepository = jest.fn().mockImplementation(() => {
      return {
        create: createMock,
        save: saveMock,
      };
    });
    const mockRepository = new MockRepository();

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

      beforeAll(async () => {
        const module: TestingModule = await Test.createTestingModule({
          providers: [
            UserService,
            {
              provide: getRepositoryToken(User),
              useValue: mockRepository,
            },
          ],
        }).compile();
        service = module.get<UserService>(UserService);
      });

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

      it('should not create invalid user', async () => {
        // ??
      });
    });

因此,虽然我可以运行测试和所有内容,但我不确定我实际上应该测试什么。我显然可以测试它在创建时是否有效,对于 findAll 等其他东西,我觉得我只是在 mock 数据库?为了让我正确测试它,它是否需要连接到数据库以便我可以检查是否返回了正确的数据?

nest 文档说“我们通常希望避免任何数据库连接”,但这样做不会违背我们的目的,因为我们不是真正测试功能吗?因为虽然我可以模拟保存返回一个值,但我没有测试唯一列、可为空数据、要设置的递增值等可能发生的任何错误...对吗?

最佳答案

许多人认为针对数据库进行测试是不好的做法。但正是出于您提到的原因 + 为自己省去管理模拟和 stub 的麻烦,我几乎总是针对专用测试数据库运行测试。

在我开玩笑的创业中,我清除了所有表,然后让助手帮助我根据需要创建具有关系的实体,以确保我的测试保持原子性。

关于testing - 使用 TypeORM 和 Nestjs 进行测试的过程,以及使用 mocks 开玩笑的过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52797727/

相关文章:

java - 为什么我的函数总是无法通过我的 JUnit 测试?

PHPUnit 测试实例

nestjs - 当某些文件更改时重新启动应用程序

node.js - 使用 TypeORM 和 NestJs 和 Typescript 创建新迁移时出错

java - 在方法内部本地访问静态最终字段的测试方法给出错误

TFS 版本 : Fails to run tests

c - autotools:执行 “make check” 时不包含库

ruby-on-rails - FactoryBot 对象缺少某些属性

rspec - Cuke4Nuke 还是 SpecFlow?

cookies - Render.com : HttpOnly Cookie not being set in browser storage when doing res. Web 服务之间的 cookie