Tengo un problema con la anulación del proveedor en la aplicación nest.js para realizar pruebas. Mi stats.controller.spec.ts:
import { StatsService } from './services/stats.service'; import { StatsController } from './stats.controller'; describe('StatsController', () => { let controller: StatsController; const mockStatsService = {}; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [StatsController], providers: [StatsService], }) .overrideProvider(StatsService) .useValue(mockStatsService) .compile(); controller = module.get<StatsController>(StatsController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });Mi stats.controller.ts:
import { Controller, Get } from '@nestjs/common'; import { StatsService } from './services/stats.service'; @Controller('stats') export class StatsController { constructor(private statsService: StatsService) {} @Get('weekly') getWeeklyStats() { return this.statsService.getWeeklyStats(); } @Get('monthly') getMonthlyStats() { return this.statsService.getMonthlyStats(); } }Y mi stats.service.ts:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Trip } from 'src/trips/trip.entity'; import { from, map } from 'rxjs'; import { DatesService } from 'src/shared/services/dates.service'; @Injectable() export class StatsService { constructor( @InjectRepository(Trip) private tripRepository: Repository<Trip>, private datesServices: DatesService, ) {} //some code here }Y después de ejecutar la prueba, obtengo los siguientes errores: No se puede encontrar el módulo 'src/trips/trip.entity' de 'stats/services/stats.service.ts' Realmente agradecería algo de ayuda.
El error no está relacionado con si está utilizando un proveedor personalizado o overrideProvider . Por defecto, Jest no entiende las importaciones absolutas, y necesitas usar la opción moduleNameMapper para decirle a Jest cómo resolver src/ imports. Usualmente algo como
{ "moduleNameMapper": { "^src/(.*)$": "<rootDir>/$1" } } Suponiendo rootDir se ha establecido en src
Puede anular el proveedor utilizando el siguiente código en nest js:
import { StatsService } from './services/stats.service'; import { StatsController } from './stats.controller'; describe('StatsController', () => { let controller: StatsController; const mockStatsService = {}; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [StatsController], providers: [{ provide: StatsService, useValue: mockStatsService }], }) .compile(); controller = module.get<StatsController>(StatsController); }); it('should be defined', () => { expect(controller).toBeDefined(); }); });