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(...); }); });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'); En mi caso, tengo muchas dependencias en mi punto final de Next API que no se pueden burlar.jest.mock no admite dependencias simuladas para importaciones fuera del archivo de prueba real (.spec.ts y .test.ts).
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); ... }); });