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) });
3 Réponses :
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.
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é.
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 .
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.
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!
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.