Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
¿Cómo me burlo completamente de una clase de servicio importada?

Estoy buscando probar mi próxima ruta API que usa el marco micro (lo suficientemente similar para expresar cuando se usa next-connect ).

tengo un servicio:

 export class UserService { constructor(...) {} async findUser({ email }: Pick<IUserModel, 'email'>) { ... } }

Mi punto final de API:

 import { NextApiRequest, NextApiResponse } from 'next'; import nc from 'next-connect'; import { UserService } from './UserService'; // Mock and prevent execution const userService = new UserService(); export default nc().post(async (req: NextApiRequest, res: NextApiResponse) => { try { userService.findUser({ email: 'john.doe@example.com' }); return res.status(200).send({ done: true }); } catch (error: any) { return res.status(500).end(error.message); } });

Me gustaría simular completamente la importación y evitar que se ejecute cualquier código dependiente.

 import { UserService } from './UserService';

Por ejemplo, si hay un archivo console.log() en el constructor de UserService, no debe ejecutarse porque la importación es una importación completamente simulada.

Actualizar:

Intenté usar jest.mock pero no parecían burlarse de mis importaciones. Agregué un archivo console.log en el constructor UserService y continúa activándose cuando se usa jest.mock .

 import signup from './signup'; jest.mock('./UserService'); describe('signup', () => { it('should complete the happy path', async () => { const req: IncomingMessage = {} as unknown as IncomingMessage; const res: ServerResponse = { end: jest.fn(), } as unknown as ServerResponse; const actual = await signup(req, res); expect(actual).toBe(...); }); });
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Si te refieres a burlarte en una prueba de broma, puedes usar jest.mock('./userService'); o jest.spyOn(UserService, 'findUser') si desea simular un método.

Si desea un simulacro para un caso de uso específico, debe crear un servicio simulado e importar condicionalmente en función de algún indicador.

Ex:

 // UserService.js export class UserService { constructor(...) {} async findUser({ email }: Pick<IUserModel, 'email'>) { // calls real API } } // UserService.mock.js export class MockUserService { constructor(...) {} async findUser({ email }: Pick<IUserModel, 'email'>) { // calls fake API or just returns a promise or anything you want } } // Your Endpoint import { NextApiRequest, NextApiResponse } from 'next'; import nc from 'next-connect'; import { UserService } from './UserService'; import { MockUserService } from './UserService.mock'; // Mock let userService; if (someCondition) { userService = new UserService(); } else { userService = new MockUserService(); } ... // The idea is you want to dynamically change what you're importing const Something = process.env.NODE_ENV === 'development' ? require('./FakeSomething') : require('./RealSomething');
about 4 years ago · Juan Pablo Isaza Denunciar

0

jest.mock no admite dependencias simuladas para importaciones fuera del archivo de prueba real (.spec.ts y .test.ts). En mi caso, tengo muchas dependencias en mi punto final de Next API que no se pueden burlar.

Tendrá que encontrar un patrón para inyectar la dependencia en el punto final y probarlo de forma aislada. Utilicé el ejemplo de middleware de Nextjs aquí, pero es probable que haya otros patrones que funcionen igual de bien.

 // Helper method to wait for a middleware to execute before continuing // And to throw an error when an error happens in a middleware function runMiddleware(req: NextApiRequest, res: NextApiResponse, fn: Function) { return new Promise((resolve, reject) => { fn(req, res, (result: any) => { if (result instanceof Error) { return reject(result) } return resolve(result) }) }) } // Testable function for DI export function post( _userService: UserService, ) { return async function(req: NextApiRequest, res: NextApiResponse) { ... } } // Endpoint export default async function(req: NextApiRequest, res: NextApiResponse) { try { await runMiddleware(req, res, post(userService)); return res.status(200).send({ done: true }); } catch (error: any) { return res.status(500).end(error.message); } }; // Test usage describe('signup', () => { let userService: UserService; beforeAll(() => { userService = new UserService({} as unknown as UserRepository); }); it('should complete the happy path', async () => { const findSpy = jest .spyOn(userService, 'find') .mockImplementation(async () => null); const req: NextApiRequest = { body: { email: 'user@test.com', password: '12345678', }, } as unknown as NextApiRequest; const res: NextApiResponse = {} as unknown as NextApiResponse; await post(userService)(req, res); ... }); });
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda