es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de inyección de dependencia para el paquete `@ntegral/nestjs-sentry` en la aplicación NestJS.

Tengo un problema con este paquete @ntegral/nestjs-sentry en nestjs. Tengo un registro personalizado que utilizo en mi aplicación.

@Injectable()
export class CustomLogger implements LoggerService {
  constructor(@InjectSentry() private readonly client: SentryService) {}

  log(message: any, ...optionalParams: any[]) {
    this.client.instance().captureMessage(message, ...optionalParams);
  }
}

Luego lo inyecto en el controlador de usuarios y en user.controller.spec.ts

describe('UsersController', () => {
  let controller: UsersController;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      controllers: [UsersController],
      providers: [
        CustomLogger,
        UsersService,
        SentryService,
      ],
    }).compile();

    controller = module.get<userscontroller>(UsersController);
  });

  it('should be defined', () => {
    expect(controller).toBeDefined();
  });
});

Recibo este error

 FAIL  src/users/users.controller.spec.ts (9.449 s)
  ● UsersController › should be defined

Nest no puede resolver las dependencias de CustomLogger (?). Asegúrese de que el argumento Symbol(SentryToken) en el índice [0] esté disponible en el contexto de RootTestModule.

Soluciones potenciales:
- Si Symbol(SentryToken) es un proveedor, ¿forma parte del RootTestModule actual?
- Si Symbol(SentryToken) se exporta desde un @Module separado, ¿ese módulo se importa en RootTestModule?
  @Module({
    imports: [ /* el módulo que contiene Symbol(SentryToken) */ ]
  })

He intentado agregar SentryService a los proveedores del spec, pero eso no soluciona el error. ¿Alguien se ha enfrentado a esto y cómo lo han solucionado?

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que Nest no puede resolver la dependencia de CustomLogger porque no puede encontrar el proveedor Symbol(SentryToken). Esto es probablemente porque no has importado el módulo @ntegral/nestjs-sentry en tu módulo de prueba.

    Para solucionar esto, debes actualizar tu módulo de prueba para incluir el SentryModule y el SentryService. Aquí tienes un ejemplo:

    import { Test, TestingModule } from '@nestjs/testing';
    import { UsersController } from './users.controller';
    import { UsersService } from './users.service';
    import { SentryModule, SentryService } from '@ntegral/nestjs-sentry';
    import { CustomLogger } from 'path/to/custom/logger';
    
    describe('UsersController', () => {
      let controller: UsersController;
    
      beforeEach(async () => {
        const module: TestingModule = await Test.createTestingModule({
          controllers: [UsersController],
          providers: [
            UsersService,
            CustomLogger,
            {
              provide: SentryService,
              useValue: {
                instance: jest.fn().mockReturnValue({
                  captureMessage: jest.fn(),
                }),
              },
            },
          ],
          imports: [
            SentryModule.forRoot({
              dsn: 'your-dsn-here',
              environment: 'test',
            }),
          ],
        }).compile();
    
        controller = module.get<userscontroller>(UsersController);
      });
    
      it('should be defined', () => {
        expect(controller).toBeDefined();
      });
    });
    

    En este ejemplo, he agregado el SentryModule al array de imports del módulo de prueba y también he proporcionado una implementación simulada del SentryService. Esto permitirá que la prueba se ejecute sin errores.

Comments are closed.