Я создаю серверную часть для простого проекта, и я получил PassportJS и локальную стратегию для работы.Я хотел добавить некоторые модульные тесты к своему контроллеру, но я не могу понять, как смоделировать всю бизнес-логику в моем passport.authenticate, который использует собственный обратный вызов.
Я уже пытался использоватьMockImplementation Jest для создания метода или функции, но он всегда дает мне TypeError, который говорит, что passport.authenticate (...) не является функцией.
Вот операция «registerUser» в моем контроллере, который использует PassportJSс пользовательским обратным вызовом в локальной стратегии.
const registerUser = async (req, res, next) => {
const userDetails = req.body;
const userValidation = bodyValidator.register(userDetails);
if (userValidation.statusCode === undefined) {
passport.authenticate('localRegister', (err, user, info) => {
if (err) throw err;
if (info !== undefined) {
res.status(400);
res.send({
status: 'error',
message: info.message,
statusCode: 400,
code: 400
});
} else {
req.logIn(user, async err => {
const userData = {
firstName: userDetails.firstName,
lastName: userDetails.lastName,
email: userDetails.email
};
await User.update(userData);
res.status(200);
res.send({
message: 'Register successful!'
});
});
}
})(req, res, next);
} else {
res.status(userValidation.statusCode);
res.send(userValidation);
}
};
И вот как сейчас выглядит мой контрольный пример, но я не знаю, как смоделировать метод аутентификации.
отредактировано, чтобы показать больше кода
const userController = require('../userController');
const User = require('../../models/users');
const passport = require('passport');
jest.mock('../../models/users');
jest.mock('passport');
describe.only('Register user succeeds', () => {
let send = jest.fn();
let status = jest.fn();
let next = jest.fn();
let res = {
send,
status
};
afterEach(() => {
send.mockRestore();
status.mockRestore();
next.mockRestore();
});
it('should send a response', async () => {
const req = {
body: {
email: 'mock@email.com',
password: 'mockPassword',
firstName: 'mockFirstName',
lastName: 'mockLastName'
},
logIn
};
passport.authenticate.mockImplementation(() => {
req, res, () => (done(null, '1', undefined))
});
User.update.mockReturnValue({});
await userController.registerUser(req, res, next);
expect(res.status).toHaveBeenCalledTimes(1);
expect(res.send).toHaveBeenCalledTimes(1);
});
});
Я получаю TypeError: passport.authenticate (...) не является функцией, в то время как я надеюсь, что могу высмеивать (err, user, info)
аргументы обратного вызова из моего контроллера passport.authenticate ()!