Как смоделировать репозиторий, сервис и контроллер в Nest JS (Typeorm & Jest) - PullRequest
0 голосов
/ 12 марта 2020

Я новичок в машинописи. Мой проект Nest js выглядит примерно так. Я пытаюсь использовать шаблон репозитория, поэтому я разделил бизнес-логи c (служба) и персистентные логи c (репозиторий)

UserRepository

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();
  }
}

UserService

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();
  }
}

UserController

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);
    }
  }
}

Как создать устройство тестирование репозитория, службы и контроллера без фактического сохранения или извлечения данных в БД (с использованием макета)?

1 Ответ

1 голос
/ 12 марта 2020

Насмешка в гнезде JS довольно легко получить с помощью инструментов тестирования, которые выставляет Nest @nestjs/testing. Короче говоря, вы захотите создать Custom Provider для зависимости, которую вы хотите смоделировать, и это все, что есть. Тем не менее, всегда лучше увидеть пример, так что здесь есть возможность макета для контроллера:

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);
  });
});

И оттуда вы можете go включить и написать свои тесты. Это почти то же самое, что и для всех тестов, использующих систему DI от Nest. Единственное, о чем нужно знать, это такие вещи, как @InjectRepository() и @InjectModel() (Mon goose и декораторы Sequilize), где вам нужно будет использовать getRepositoryToken() или getModelToken() для токена инъекции. Если вы ищете больше примеров , посмотрите на этот репозиторий

...