Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

254
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!