NestJS TypeORM InjectRepository Не удается прочитать свойство «прототип» неопределенного

Попытка юнит-теста. Получил следующую ошибку:

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 28.04.2019 07:38

@ alex88 да. Я воссоздал проект и скопировал все старые файлы в новые. Похоже, это была какая-то ошибка типоформы.

rankery 28.04.2019 11:45
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
8
2
11 083
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я только что передал объект пользователя в репозиторий, и он работает.

@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. Я попробовал ваш код, но все равно получаю ту же ошибку.

rankery 06.03.2019 17:43

Странно, typeorm вообще не участвует в тесте контроллера. Какова трассировка стека ошибки, куда она указывает?

Kim Kern 06.03.2019 18:03

Взгляните на этот тест для справки: github.com/kiwikern/shassi-nest/blob/master/src/auth/…

Kim Kern 06.03.2019 18:05

Это указывает на @InjectRepository(User) в Object.getRepositoryToken

rankery 06.03.2019 18:20

Это действительно странно. Фактический UserService должен быть создан экземпляр никогда, когда вы выполняете модульное тестирование AuthController или AuthService с моками.

Kim Kern 06.03.2019 18:54

Давайте продолжить обсуждение в чате.

rankery 06.03.2019 18:59
Ответ принят как подходящий

Я посмотрел проект, который вы предоставили в комментарии под Ким Керн (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 (или просто удалить файл) и исправить сломанный импорт, вызванный этим удалением, и он должен работать.

Чтобы ваш ответ был более полезным для пользователя, не могли бы вы дать больше пояснений, пожалуйста.

Samer Abu Gahgah 04.04.2019 16:09

Ты спас меня живым!

Vương Nguyễn 10.06.2020 09:47

Я потратил часы, чтобы понять это, и это работает

 async findAll() {
    
    return await this.userRepository.createCursor(this.userRepository.find()).toArray();
  }

Другие вопросы по теме