express тест маршрутизатора с несколькими обработчиками - PullRequest
0 голосов
/ 29 мая 2020

Я тестирую свое промежуточное программное обеспечение защиты, но, хотя все, кажется, работает нормально, мой оператор expect не работает.

/// auth.test. js

const request = require('supertest');
const express = require('express');
const app = require('../../app');
const authMiddleware = require('./auth.middleware');

const mockRes = () => {
  const res = {};
  res.status = jest.fn().mockReturnValue(res);
  res.sendStatus = jest.fn().mockReturnValue(res);
  res.send = jest.fn().mockReturnValue(res);
  return res;
};

describe('Authorization', () => {
  const guardedRouter = express.Router();

  guardedRouter.get(
    '/guardedandauthenticated',
    [authMiddleware.authenticate, authMiddleware.authorize('admin')],
    (req, res, _next) => {
      console.log('seems to be working');
      res.status(200);
      console.log('res is 200000000');
    },
  );

  let accessToken = '';
  beforeAll(async () => {
    const res = await request(app).post('/auth/login').send({
      username: 'admin',
      password: 'admin',
    });
    expect(res.status).toBe(200);
    accessToken = res.body.accessToken;
  });


  it('should allow access to authorized roles', () => {
    const response = mockRes();
    // @ts-ignore
    guardedRouter.handle(
      {
        headers: { authorization: `Bearer ${accessToken}` },
        url: '/guardedandauthenticated',
        method: 'GET',
      },
      response,
    );
    // THIS EXPECTATION IS FAILED
    expect(response.status).toHaveBeenCalledWith(200);
  });
});

// / auth.middleware. js

    module.exports.authorize = role => {
  return async (req, res, next) => {
    if (!req.user) {
      return res.status(403).send({
        message: 'Unauthorized! No token provided!',
      });
    }
    if (req.user.role === undefined) {
      const privileges = await userService.getUserPrivileges(req.user.id);
      req.user.role = privileges.map(f => f.privilege_name);
    }
    const userRoles = req.user.role;

    const rolesToCheck = Array.isArray(role) ? role : [role];
    if (!rolesToCheck.every(r => userRoles.includes(r))) {
      return res.status(403).send({
        message: `Unauthorized! Required privileges are: ${userRoles.toString()}`,
      });
    }
    return next();
  };
};

/// результат шутки

   expect(jest.fn()).toHaveBeenCalledWith(...expected)

    Expected: 200

    Number of calls: 0

Я очистил код, мои аналогичные утверждения выполнены успешно, и код, похоже, работает Хорошо, либо я неправильно настроил маршрутизатор, либо я понятия не имею. Консольные сообщения в маршрутизаторе выводятся в виде шутки, поэтому он работает нормально. Заранее спасибо,

1 Ответ

0 голосов
/ 29 мая 2020

ну, это оказалось шуткой, вам нужно сказать шутке, что все готово.

  it('should allow access to authorized roles', async done => {
    const res = { statusCode: 100 };
    res.status = function (code) {
      res.statusCode = code;
      return res;
    };
    // @ts-ignore
    guardedRouter.handle(
      {
        headers: { authorization: `Bearer ${accessToken}` },
        url: '/guardedandauthenticated',
        method: 'GET',
      },
      res,
    );
    setTimeout(() => {
      done();
      expect(res.statusCode).toBe(200);
    }, 300);
  });

поэтому я добавил готовый обратный вызов в тестовый пример и проверил значение после завершения обработчика . Это все еще не похоже на идеальное решение. Дело в том, что дескриптор вызовет 3 функции, одна из них - asyn c, я не мог заставить его сообщать правильно, не установив таймер. Решение должно быть без таймера, может ли кто помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...