JestockImplementation, похоже, не переопределяет функцию исходного издеваемого модуля.Javascript

Форум по Javascript
Ответить
Anonymous
 JestockImplementation, похоже, не переопределяет функцию исходного издеваемого модуля.

Сообщение Anonymous »

Я тестирую довольно простую конечную точку API узла:

Код: Выделить всё

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' });
}
});
};

Мой первоначальный макет работает так, как я ожидал: в первом тесте тестовый пользователь успешно издевается, тест получает статус 200, а также может подтвердить, что имитируемые данные возвращается правильно.

Код: Выделить всё

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' });
});
});

Однако кажется, что функция макета, которую я настроил при попытке протестировать неаутентифицированных пользователей, не срабатывает при запуске теста, и исходный макет паспорта вместо этого получить удар. Когда я записываю в консоль как исходную имитируемую функцию, так и макет_Implementation для паспорта.authenticate, я вижу, что первоначальный макет вызывается дважды.
Я пробовал дополнительно следующее:
  • Импорт паспорта после имитации паспорта на случай, если возникнут проблемы с областью действия. Хотя мои плагины prettier и eslint меняют порядок импорта в начало файла.
  • Добавление beforeEach, где я пытался сбросить макет: `(passport.authenticate как jest.Mock).resetMock


Подробнее здесь: https://stackoverflow.com/questions/793 ... ules-funct
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»