#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
массив, который используется для внедрения зависимостей.