Попытка юнит-теста. Получил следующую ошибку:
TypeError: Cannot read property 'prototype' of undefined
export class UserService {
constructor(@InjectRepository(User) private readonly userRepository: Repository < User>) { }
спец.ц:
describe('AuthController', () => {
let authController: AuthController;
let authService: AuthService;
let mockRepository = {
};
beforeEach(async () => {
const module = await Test.createTestingModule({
imports: [
TypeOrmModule.forFeature([User]),
],
controllers: [AuthController],
providers: [AuthService, {
provide: getRepositoryToken(User),
useValue: mockRepository
}]
}).compile()
authService = module.get<AuthService>(AuthService);
authController = module.get<AuthController>(AuthController)
});
Может кто-нибудь поделиться решением, пожалуйста?
БОЛЬШЕ ИНФОРМАЦИИ:
Так что, похоже, что-то не так с typeorm
beforeEach(async () => {
const module = await Test.createTestingModule({
}).compile()
authService = module.get<AuthService>(AuthService);
authController = module.get<AuthController>(AuthController)
});
С этим кодом я получаю ту же ошибку. Так что единственная проблема заключается в добавлении typeorm к этому тестовому модулю.
Так что это не удается из-за зависимости: AuthController->AuthService->UserService->TypeORM
Кстати, только что проверил UserService с помощью API с Postman, все работает нормально.
До сих пор нет результата:
module = await Test.createTestingModule({
controllers: [AuthController],
components: [
{
provide: AuthService,
useValue: {}
},
{
provide: UserService,
useValue: {}
},
{
provide: getRepositoryToken(User),
useValue: {}
}
],
providers: [
{
provide: AuthService,
useValue: {}
},
{
provide: UserService,
useValue: {}
},
{
provide: getRepositoryToken(User),
useValue: {}
}
]
}).compile()
this.authController = module.get<AuthController>(AuthController)
Также
class AuthServiceMock {
logIn(userName) {
return { id:100, isDeleted:false, login:"login", password:"password"};
}
signUp() {
return { expireIn: 3600, token:"token" };
}
}
describe('AuthController', () => {
let module: TestingModule;
let authController: AuthController;
let authService: AuthService;
beforeEach(async () => {
module = await Test.createTestingModule({
controllers: [AuthController],
components: [
],
providers: [
{
provide: AuthService,
useClass: AuthServiceMock
},
]
}).compile()
this.authController = module.get<AuthController>(AuthController)
});
@ alex88 да. Я воссоздал проект и скопировал все старые файлы в новые. Похоже, это была какая-то ошибка типоформы.






Я только что передал объект пользователя в репозиторий, и он работает.
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>
) { }
}
Ознакомьтесь с документами здесь: https://docs.nestjs.com/techniques/база данных. У них очень хорошие документы.
Когда вы импортируете TypeOrmModule.forFeature(...), вы также должны импортировать TypeOrmModule.forRoot(...). Но в модульном тесте вы, вероятно, не хотите работать со своей базой данных, а вместо этого имитируете все зависимости.
Ваш контроллер не должен напрямую обращаться к базе данных, для чего и нужен сервис. Поэтому, если вы хотите протестировать свой контроллер, а он только внедряет службу, вам следует только объявить макет AuthService и ничего не импортировать:
const module = await Test.createTestingModule({
controllers: [AuthController],
providers: [{
provide: AuthService,
useValue: authServiceMock
}]
}).compile()
Если вы хотите протестировать свой AuthService, и он только внедряет репозиторий, объявите свой mockRepository и оставьте все остальное.
UserService внедряет репозиторий, а AuthService внедряет UserService. Я попробовал ваш код, но все равно получаю ту же ошибку.
Странно, typeorm вообще не участвует в тесте контроллера. Какова трассировка стека ошибки, куда она указывает?
Взгляните на этот тест для справки: github.com/kiwikern/shassi-nest/blob/master/src/auth/…
Это указывает на @InjectRepository(User) в Object.getRepositoryToken
Это действительно странно. Фактический UserService должен быть создан экземпляр никогда, когда вы выполняете модульное тестирование AuthController или AuthService с моками.
Давайте продолжить обсуждение в чате.
Я посмотрел проект, который вы предоставили в комментарии под Ким Керн (https://github.com/rankery/wof-сервер)
Вы используете файл бочонка (src/user/index.ts), экспортируете UserModule
export * from './user.module';
Я предполагаю, что вы используете этот файл ствола для импорта модуля позже.
Теперь каждый раз при импорте содержимого файла барреля выполняется код, содержащийся в встроенной версии вашего src/user/user.module.ts, который включает оформление класса UserModule, что, в свою очередь, заставит Typeorm попытаться построить репозиторий, что вызывает ошибка.
Вы должны удалить этот экспорт из src/user/index.ts (или просто удалить файл) и исправить сломанный импорт, вызванный этим удалением, и он должен работать.
Чтобы ваш ответ был более полезным для пользователя, не могли бы вы дать больше пояснений, пожалуйста.
Ты спас меня живым!
Я потратил часы, чтобы понять это, и это работает
async findAll() {
return await this.userRepository.createCursor(this.userRepository.find()).toArray();
}
Вы ее как-то решили? у меня такая же проблема