Как протестировать сервис с несколькими параметрами конструктора в NestJS

#node.js #typescript #testing #jestjs #nestjs

#node.js #typescript #тестирование #jestjs #nestjs

Вопрос:

Справочная информация

Когда я тестирую сервис, для которого требуется один параметр в конструкторе, я должен инициализировать сервис как поставщик, используя объект, а не просто передавать сервис как поставщик:

auth.service.ts (пример)

 @Injectable()
export class AuthService {

  constructor(
    @InjectRepository(Admin)
    private readonly adminRepository: Repository<Admin>,
  ) { }

  // ...

}
  

auth.service.spec.ts (пример)

 describe('AuthService', () => {
  let authService: AuthService


  beforeEach(async () => {
    const module = await Test.createTestingModule({
        providers: [
          AuthService,
          {
            provide: getRepositoryToken(Admin),
            useValue: mockRepository,
          },
        ],
      }).compile()

    authService = module.get<AuthService>(AuthService)
  })

  // ...

})
  

Источник этого объяснения смотрите в этом выпуске на GitHub.


Моя проблема

У меня есть сервис, для которого требуется 2 параметра в конструкторе:

auth.service.ts

 @Injectable()
export class AuthService {
  constructor(
    private readonly jwtService: JwtService,
    private readonly authHelper: AuthHelper,
  ) {}

  // ...

}
  

Как мне инициализировать этот сервис в тестовой среде? Я не могу передать несколько значений в useValue массив providers . У моего AuthService конструктора есть 2 параметра, и мне нужно передать их оба, чтобы тест сработал.

Вот моя текущая (не рабочая) настройка:

auth.service.spec.ts

 describe('AuthService', () => {
  let service: AuthService

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      providers: [AuthService],
    }).compile()

    service = module.get<AuthService>(AuthService)
  })

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

  // ...

})
  

Когда я не передаю их, я получаю следующую ошибку:

AuthService › should be defined

    Nest can't resolve dependencies of the AuthService (?, AuthHelper). Please make sure that the argument at index [0] is available in the TestModule context.
  

Ответ №1:

Просто создайте запись в providers массиве для каждого поставщика, который введен в ваш AuthService конструктор:

 beforeEach(async () => {
  const module: TestingModule = await Test.createTestingModule({
    providers: [
      AuthService,
      {provide: JwtService, useValue: jwtServiceMock},
      {provide: AuthHelper, useValue: authHelperMock},
    ],
  }).compile()
  

Тестовая утилита Test.createTestingModule() создает модуль, точно такой же, как ваш, AppModule и, следовательно, также имеет providers массив, который используется для внедрения зависимостей.