Код: Выделить всё
import { getRaces } from '@/services/races';
import { Request, Response, Router } from 'express';
import passport from 'passport';
export default (app: Router) => {
app.get('/races', passport.authenticate('jwt', { session: false }), async (req: Request, res: Response) => {
console.log(req);
if (req.user) {
res.status(200).json({ races: await getRaces() });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
};
Код: Выделить всё
import express from 'express';
import passport from 'passport';
import request from 'supertest';
import { getRaces } from '@/services/races';
import charactersRoute from './races';
jest.mock('@/services/races');
jest.mock('passport', () => ({
authenticate: jest.fn(() => (req, _res, next) => {
req.user = { id: 'test-user' }; // Mock authenticated user
next();
}),
}));
const app = express();
app.use(express.json());
const router = express.Router();
charactersRoute(router);
app.use(router);
describe('GET /races', () => {
it('should return 200 and a list of races when authenticated', async () => {
const mockRaces = [
{ id: 1, name: 'Elf' },
{ id: 2, name: 'Dwarf' },
];
(getRaces as jest.Mock).mockResolvedValue(mockRaces);
const response = await request(app).get('/races');
expect(response.status).toBe(200);
expect(response.body).toEqual({ races: mockRaces });
});
it('should return 401 when not authenticated', async () => {
(passport.authenticate as jest.Mock).mockImplementation(() => (_req, _res, next) => {
next();
});
const response = await request(app).get('/races');
expect(response.status).toBe(401);
expect(response.body).toEqual({ error: 'Unauthorized' });
});
});
Я пробовал дополнительно следующее:
- Импорт паспорта после имитации паспорта на случай, если возникнут проблемы с областью действия. Хотя мои плагины prettier и eslint меняют порядок импорта в начало файла.
- Добавление beforeEach, где я пытался сбросить макет: `(passport.authenticate как jest.Mock).resetMock
Подробнее здесь: https://stackoverflow.com/questions/793 ... ules-funct
Мобильная версия