4
votes

NestJS TypeORM InjectRepository Impossible de lire la propriété 'prototype' d'undefined

Tentative de test unitaire. Vous avez l'erreur suivante:

TypeError: impossible de lire la propriété 'prototype' d'undefined

classe d'exportation UserService {

constructeur (@InjectRepository (User) private readonly userRepository: Référentiel ) {}

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

Quelqu'un peut-il partager une solution s'il vous plaît?

PLUS D'INFO :

Il semble donc que quelque chose ne va pas avec typeorm

 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)

Avec ce code, je suis obtenir exactement la même erreur. Le seul problème est donc d'ajouter typeorm à ce module de test.

Donc, cela échoue à cause de la dépendance: AuthController-> AuthService-> UserService-> TypeORM

Btw vient de vérifier UserService en utilisant l'API avec Postman et cela fonctionne bien.

Toujours pas de résultat:

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

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

Aussi

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


2 commentaires

L'avez-vous résolu d'une manière ou d'une autre? J'ai le même problème


@ alex88 oui. J'ai recréé le projet et copié tous les anciens fichiers vers les nouveaux. On dirait que c'était un bug de typeorm.


3 Réponses :


0
votes

Je viens de transmettre l'entité User au référentiel et cela fonctionne.

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

}

Consultez la documentation à partir d'ici: https://docs.nestjs.com/techniques/database . Ils ont de très bons documents.


0 commentaires

0
votes

Lorsque vous importez TypeOrmModule.forFeature (...) , vous devez également importer TypeOrmModule.forRoot (...) . Mais dans un test unitaire, vous ne voulez probablement pas travailler avec votre base de données, mais plutôt simuler toutes les dépendances.

Votre contrôleur ne doit pas accéder directement à la base de données, c'est à cela que sert le service. Donc, si vous voulez tester votre contrôleur et qu'il n'injecte que le service, vous devez seulement déclarer un simulacre de AuthService et ne rien importer:

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

Si vous voulez tester votre AuthService et il injecte uniquement le référentiel, déclarez votre mockRepository et laissez tout le reste de côté.


6 commentaires

UserService injecte le référentiel et AuthService injecte UserService. J'ai essayé votre code mais j'ai toujours la même erreur.


Bizarre, typeorm n'est pas du tout impliqué dans le test du contrôleur. Quelle est la trace de l'erreur, où pointe-t-elle?


Jetez un œil à ce test pour référence: github.com/kiwikern/shassi-nest/blob/master/src/auth/...


Son point sur @InjectRepository (User) à Object.getRepositoryToken


C'est vraiment bizarre. Le UserService réel ne doit jamais être instancié lorsque vous testez l'unité AuthController ou le AuthService avec des simulations.


continuons cette discussion dans le chat .



2
votes

J'ai regardé le projet que vous avez fourni dans un commentaire sous Kim Kern ( https://github.com / rankery / wof-server )

Vous utilisez un fichier barrel ( src / user / index.ts ), exportez le UserModule p >

export * from './user.module';

Je suppose que vous utilisez ce fichier barrel pour importer le module plus tard.

Maintenant, à chaque fois que le contenu du fichier barrel est importé, le code contenait dans la version construite de votre src / user / user.module.ts est exécuté, ce qui inclut la décoration de la classe UserModule , qui à son tour obligera Typeorm à essayer de construire un référentiel, ce qui provoque l'erreur.

Vous devez supprimer cette exportation de src / user / index.ts (ou simplement supprimer le fichier) et corriger les importations interrompues causées par cela suppression et cela devrait fonctionner.


2 commentaires

Afin de permettre à davantage d'utilisateurs de profiter de votre réponse, pourriez-vous fournir plus d'explications s'il vous plaît.


Vous m'avez sauvé en vie!