NestJS TypeORM InjectRepository Невозможно прочитать свойство 'prototype' из неопределенного - PullRequest
3 голосов
/ 05 марта 2019

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

TypeError: Невозможно прочитать свойство 'prototype' из неопределенного

класс экспорта UserService {

конструктор (@InjectRepository (User) private readonly userRepository: Репозиторий <Пользователь>) {}

spec.ts:

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 с Почтальоном, и он отлично работает.

По-прежнему нет результата:

 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)
});

Ответы [ 3 ]

1 голос
/ 04 апреля 2019

Я посмотрел на проект, который вы предоставили в комментарии под Ким Керн (https://github.com/rankery/wof-server)

Вы используете файл ствола (src/user/index.ts), экспортируете UserModule

export * from './user.module';

Полагаю, вы используете этот файл барреля для последующего импорта модуля.

Теперь, каждый раз, когда импортируется содержимое файла барреля, выполняется код, содержащийся во встроенной версии вашего src/user/user.module.ts, включая декорацию класса UserModule, что, в свою очередь, заставит Typeorm попытаться построить репозиторий, который вызывает ошибку.

Вы должны удалить этот экспорт из src/user/index.ts (или просто удалить файл) и исправить поврежденный импорт, вызванный этим удалением, и он должен работать.

0 голосов
/ 06 марта 2019

При импорте TypeOrmModule.forFeature(...) вы также должны импортировать TypeOrmModule.forRoot(...).Но в модульном тесте вы, вероятно, не хотите работать с вашей базой данных, а вместо этого смоделируйте все зависимости.

Ваш контроллер не должен обращаться к базе данных напрямую, для этого предназначен сервис.Поэтому, если вы хотите протестировать свой контроллер и он только внедряет службу, вы должны только объявить макет AuthService и ничего не импортировать:

const module = await Test.createTestingModule({
    controllers: [AuthController],
    providers: [{
        provide: AuthService,
        useValue: authServiceMock
    }]
}).compile()

Если вы хотите протестировать свой AuthService и тольковнедряет репозиторий, объявляет ваш mockRepository и пропускает все остальное.

0 голосов
/ 05 марта 2019

Я только что передал сущность User в репозиторий, и она работает.

@Injectable()
export class UserService {
    constructor(
        @InjectRepository(User)
        private readonly userRepository: Repository<User>
    ) { }

}

Извлечение документов отсюда: https://docs.nestjs.com/techniques/database. У них довольно хорошие документы.

...