Jest Express тестирование промежуточного программного обеспечения с аргументами - PullRequest
0 голосов
/ 31 января 2020

Я довольно новичок в узле, и я впервые тестирую приложение. У меня хорошо получается, что Jest подделывает запрос с помощью функции Jest, как показано ниже:

// Create a fake request
 const mockRequest = (sessionData, body) => ({
  session: { data: sessionData },
  body
});

// Create a fake response
 const mockResponse = () => {
  const res = {};
  res.status = jest.fn().mockReturnValue(res);
  res.json = jest.fn().mockReturnValue(res);
  return res;
};

const mockNext = () => {
  const next = jest.fn();
  return next;
};

Так что я могу использовать их следующим образом

doSomething(req, res, next);
expect(res.status).toHaveBeenCalledWith(201);
//or
expect(next).toHaveBeenCalled();

Этого достаточно для всех случаев, пока я не обнаружу, что мое промежуточное ПО для авторизации включает в себя несколько параметров, поэтому я не могу передать поддельные res и req, как показано ниже

exports.isAllowedTo = (par1, par2) => {
    return async (req, res, next) => {
        try {
            //
            // Grant logic here that needs par1 and par2
            //

            if(granted)
                next();
            else
                return res.status(401).json({
                    error: "You don't have enough permission to perform this action"
                });

        } catch (err) {
            res.status(406).json({
                error: err.toString(),
            })
        }
    }
}

Если я проверю isAllowTo(req, res, next) с помощью mock req, res и next, то мне не хватает 2 параметры, необходимые для функции. На самом деле, когда я это делаю, функция isAllowTo() даже не вызывается. Я не знаю, как с этим справиться. Любое предложение или подход?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Два месяца спустя я понял, что настоящая проблема в том, что я тестирую функцию внутри другой функции. Поэтому сначала я сохраняю функцию в переменной, чтобы проверить ее как обычное промежуточное ПО.

test('Grant access if user role is allowed to', async () => {

    const isAllowToTester = userController.isAllowedTo(par1, par2);

    await isAllowToTester(req, res, next)

    expect(next).toHaveBeenCalled();

});

Надеюсь, это поможет кому-то еще. Кредиты на этот пост

0 голосов
/ 31 января 2020

Check https://github.com/nock/nock это библиотека, предназначенная для насмешливых запросов и ответов, ее очень легко использовать с юнит-тестами / шутками. Лично я не думаю, что стоит написать свою собственную насмешливую реализацию.

...