Website-Suche

node.js - Wie man Repository, Service und Controller in NestJS (Typeorm & Jest) simuliert


Ich bin neu in TypeScript. Mein NestJS-Projekt sieht ungefähr so aus. Ich versuche, das Repository-Muster zu verwenden, also habe ich die Geschäftslogik (Service) und die Persistenzlogik (Repository) getrennt.

BenutzerRepository

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

import { UserEntity } from './entities/user.entity';

@Injectable()
export class UserRepo {
  constructor(@InjectRepository(UserEntity) private readonly repo: Repository<UserEntity>) {}

  public find(): Promise<UserEntity[]> {
    return this.repo.find();
  }
}

Benutzerdienst

import { Injectable } from '@nestjs/common';
import { UserRepo } from './user.repository';

@Injectable()
export class UserService {
  constructor(private readonly userRepo: UserRepo) {}

  public async get() {
   return this.userRepo.find();
  }
}

BenutzerController

import { Controller, Get } from '@nestjs/common';

import { UserService } from './user.service';

@Controller('/users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  // others method //

  @Get()
  public async getUsers() {
    try {
      const payload = this.userService.get();
      return this.Ok(payload);
    } catch (err) {
      return this.InternalServerError(err);
    }
  }
}

Wie erstelle ich Unit-Tests für Repository, Service und Controller, ohne tatsächlich Daten in der Datenbank zu speichern oder abzurufen (unter Verwendung von Mocks)?

Antwort #1

Das Mocking in NestJS ist ziemlich leicht erreichbar mithilfe der Testing-Tools, die Nest über @nestjs/testing bereitstellt. Kurz gesagt, Sie möchten einen Custom Provider für die Abhängigkeit erstellen, die Sie nachahmen möchten, und das ist alles. Es ist jedoch immer besser, ein Beispiel zu sehen, also hier ist eine Möglichkeit für ein Mock des Controllers:

describe('UserController', () => {
  let controller: UserController;
  let service: UserService;
  beforeEach(async () => {
    const moduleRef = await Test.createTestingModule({
      controllers: [UserController],
      providers: [
        {
          provide: UserService,
          useValue: {
            get: jest.fn(() => mockUserEntity) // really it can be anything, but the closer to your actual logic the better
          }
        }
      ]
    }).compile();
    controller = moduleRef.get(UserController);
    service = moduleRef.get(UserService);
  });
});

Und von dort aus können Sie Ihre Tests schreiben. Dies ist im Grunde dasselbe Setup für alle Tests, die Nests DI-System verwenden. Das Einzige, worauf Sie achten müssen, sind Dinge wie @InjectRepository() und @InjectModel() (Mongoose- und Sequelize-Dekoratoren), bei denen Sie getRepositoryToken() oder getModelToken() für das Injection-Token verwenden müssen. Wenn Sie nach weiteren Beispielen suchen, werfen Sie einen Blick auf dieses Repository.

Verwandte Artikel