Nest.js Не удается разрешить циклическую зависимость от TestingModule

#typescript #backend #nestjs

#typescript #серверная часть #nestjs

Вопрос:

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

Пример «LimitsService», созданного с циклической зависимостью с помощью «MathService»:

 @Injectable()
export class LimitsService {
      constructor(
        private readonly listService: ListService,
        @Inject(forwardRef(() => MathService))
        private readonly mathService: MathService,
      ) {}

      async verifyLimit(
        user: User,
        listId: string,
      ): Promise<void> {
         ...
         this.mathService.doSomething()
      }
     
      async someOtherMethod(){...}
}
  

MathService вызывает LimitService.SomeOtherMethod в одном из своих методов.

Вот как настроен модуль тестирования для «MathService» (раньше все работало нормально без «LimitsService»):

 const limitsServiceMock = {
  verifyLimit: jest.fn(),
  someOtherMethod: jest.fn()
};

const listServiceMock = {
  verifyLimit: jest.fn(),
  someOtherMethod: jest.fn()
};

describe('Math Service', () => {

  let mathService: MathService;
  let limitsService: LimitsService;
  let listService: ListService;
  let httpService: HttpService;


  beforeEach(async () => {
    const mockModule: TestingModule = await Test.createTestingModule({
      imports: [HttpModule],
      providers: [
        MathService,
        ConfigService,
        {
          provide: LimitsService,
          useValue: limitsServiceMock
        },
        {
          provide: ListService,
          useValue: listServiceMock
        },
      ],
    }).compile();
    
    httpService = mockModule.get(HttpService);
    limitsService = mockModule.get(LimitsService);
    listService = mockModule.get(ListService);
    mathService= mockModule.get(MathService);
    
 });

...tests
  

Но когда я запускаю тестовый файл, я получаю:

«Nest не может разрешить зависимости MathService (…). Пожалуйста, убедитесь, что зависимость аргумента по индексу [x] доступна в контексте RootTestModule «.

Я попытался прокомментировать «mathService» из «LimitsService», и это работает, когда я это делаю, но мне нужен mathService.

Я также попытался импортировать «LimitsModule» вместо предоставления «LimitsService» с помощью forwardRef(), а затем получить «LimitsService» из mockModule, но это вызвало ту же ошибку.

Каков правильный способ импорта моего «LimitsService» в mockModule?

Комментарии:

1. Кажется, что LimitsService требует двух зависимостей, то есть ListService и MathService. Однако в вашем коде вы не предоставляете ListService в качестве поставщиков. Возможно, вы можете добавить ListService в свой список поставщиков и повторить попытку.

2. Моя ошибка, когда я добавил пример, в моем коде у меня есть ListService, указанный в качестве поставщика

Ответ №1:

Теперь это работает у меня.

РЕШЕНИЕ

Импортируйте шутливый макет LimitsService

 jest.mock('@Limits/limits.service');
  

Установите поставщика с макетом

 describe('Math Service', () => {

  let mockLimitsService : LimitsService;

  let mathService: MathService;
  let listService: ListService;
  let httpService: HttpService;


  beforeEach(async () => {
    const mockModule: TestingModule = await Test.createTestingModule({
      imports: [HttpModule],
      providers: [
        MathService,
        ConfigService,
        LimitsService,
        {
          provide: ListService,
          useValue: listServiceMock
        },
      ],
    }).compile();

    mockLimitsService = mockModule.get(LimitsService);

    httpService = mockModule.get(HttpService);
    listService = mockModule.get(ListService);
    mathService= mockModule.get(MathService);
    
 });
  

Комментарии:

1. Эй, я столкнулся с той же проблемой! Где все же определен listServiceMock?

2. Эй, это было бы определено как: const listServiceMock = { verifyLimit: jest.fn(), someOtherMethod: jest.fn() };