Как можно смоделировать пользовательский метод обратного вызова passport.authenticate (...) в PassportJS, используя Jest? - PullRequest
0 голосов
/ 10 июля 2019

Я создаю серверную часть для простого проекта, и я получил 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 ()!

...