Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NestJS TypeORM InjectRepository Cannot read property 'prototype' of undefined

Trying to unit test. Got following error:

TypeError: Cannot read property 'prototype' of undefined

export class UserService {

constructor(@InjectRepository(User) private readonly userRepository: Repository < User>) { }

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

Can someone share a solution please?

MORE INFO:

So seems like its something wrong with typeorm

beforeEach(async () => {
    const module = await Test.createTestingModule({

    }).compile()
    authService = module.get<AuthService>(AuthService);
    authController = module.get<AuthController>(AuthController)
});

With this code I'm getting exact the same error. So only problem is adding typeorm to this test Module.

So it fails because of dependency: AuthController->AuthService->UserService->TypeORM

Btw just checked UserService using API with Postman and it works fine.

Still no result:

 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)

Also

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)
});
like image 357
rankery Avatar asked Mar 05 '19 19:03

rankery


1 Answers

I looked at the project you provided in a comment under Kim Kern (https://github.com/rankery/wof-server)

You are using a barrel file (src/user/index.ts), exporting the UserModule

export * from './user.module';

I guess you are using this barrel file to import the module later on.

Now, every time the content of the barrel file is imported , the code contained in the built version of your src/user/user.module.ts is executed, which include the decoration of the UserModule class, which in turns will make Typeorm try to build a Repository, which causes the error.

You should remove this export from src/user/index.ts (or simply delete the file) and fix the broken imports caused by this removal and it should work.

like image 131
Thibault Burger Avatar answered Nov 13 '22 12:11

Thibault Burger