Синон не заглушает мои стажировки во время тестирования.(ExpressJS) - PullRequest
0 голосов
/ 26 сентября 2018

в настоящее время я хочу реализовать заглушки sinon для моих экспресс-маршрутов.Проблема в том, что я не понимаю, почему он не заменяет мои функции.

Мой тест должен сделать запрос к моему login-route и вместо вызова функции authenticate мой login-route должен вызвать фальшивкуфункция.Любая идея, как это сделать?

Моя структура проекта

/src/http/routes/login.js
/src/http/middlewares/user-midd.js
/test/test.js

test.js:

const sinon = require('sinon');
const proxyquire = require('proxyquire');

const chai = require('chai');
const expect = chai.expect;
const chaiHttp = require('chai-http');
chai.use(chaiHttp);

const rawapp = require('../src/http/app');

let stub;

try {
    stub = sinon.stub(require('../src/http/middlewares/user-midd').create(),'authenticate')

    proxyquire('../src/http/middlewares/user-midd', {
        'authenticate': stub
    });

    stub.callsFake((request, response, next) => {
        console.log("IM IN FAKE CALL FUNCTION", request, response, next)
        return next()
    })

    chai.request(rawapp())
        .get('/api/v1/de/login')
        .set('X-Xamarin-Client-Version', 1)
        .then((res) => {
            expect(res).to.have.status(200)
            done();
        }).catch(err => console.error(err))
} catch (err) { console.error(err) }

логин.js:

function loginRoute() {
  const authenticate = userMiddleware.create().authenticate;
  const login = new express.Router({ mergeParams: true });

  login.get('/', authenticate, (req, res) => {
    logger.info(new Date(), 'In login route GET /');
    console.log("LOGIN FUNCTION")
    res.status(res.locals.statusCode).json(res.locals.user);
  });

  return login;
}

module.exports.create = loginRoute;

и, наконец, мое route-middleware: (user-midd.js)

    module.exports.create = function create() {
  function authenticate(req, res, next) {
    console.log("AUTHENTIFICATION FUNCTION")
    const authHeader = req.get('authorization');
    const userAuthHeader = req.get('user-authorization') || '';

    if (authHeader) {
      const mandator = req.params.mandator;
      const path = `api/v1/${mandator}/login`;

      logger.info(hostname + path);
      return request
      .get(hostname + path)
      .set('Authorization', authHeader)
      .set('User-Authorization', userAuthHeader)
      .then((mbaasRes) => {
        logger.info('Got response from service - status : ', mbaasRes.statusCode);

        res.locals.user = {};
        res.locals.statusCode = mbaasRes.statusCode;

        if (mbaasRes.body) {
          res.locals.user = mbaasRes.body;
        }

        setUserAuthHeader.setHeader(mbaasRes, res);

        return next();
      })
      .catch((err) => {
        logger.error('service user call failed - err : ', err);
        return next(err);
      });
    }

    const error = {
      msg: 'Unauthorized',
      statusCode: 401,
    };

    return next(error);
  }

  return {
    authenticate,
  };
};

Результат выполнения моего тестаis: ожидается, что {Object (_events, _eventsCount, ...)} будет иметь код состояния 200, но получил 500 '

Означает, что при тестировании он не заменяет «authenticate»функция.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

proxyquire здесь может не потребоваться, мы можем просто использовать Sinon .

Это может работать

...

describe('app test', function() {
  beforeEach(function() {
    sinon.stub(userMiddleware, 'create').returns({ // use returns of Sinon
      authenticate: sinon.stub.callsFake((request, response, next) => {
        console.log("IM IN FAKE CALL FUNCTION", request, response, next); 
        next();
      })
    });
  });

  afterEach(function() {
    sinon.restore()
  });

  it('success', function(done) {
    chai.request(rawapp())
      .get('/api/v1/de/login')
      .set('X-Xamarin-Client-Version', 1)
      .then((res) => {
          expect(res).to.have.status(200)
          done();
      }).catch(err => console.error(err))
  });
})
0 голосов
/ 26 сентября 2018

Это не так, как работает Синон.Если вы хотите смоделировать функции, необходимые в других файлах, вам следует взглянуть на proxyquire .

См. Один из моих более ранних ответов для объяснения.

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