Проверка промежуточного программного обеспечения вызывается из http-вызова - PullRequest
0 голосов
/ 25 января 2019

Как можно проверить, что часть пользовательского промежуточного программного обеспечения на самом деле вызывается из стандартного события HTTP?

т. Промежуточное программное обеспечение вызывается из:

MyController.js

router.get('/some/endpoint', [myMiddleware()], (req, res, next) => {
    // Code to do whatever here
});

Само промежуточное программное обеспечение может быть определено как:

MyMiddleware.js

module.exports = () => {
    // Middleware code in here
}

Мой квест состоит в том, чтобы проверить, что промежуточное программное обеспечение вызывается один раз из моего модульного теста, но я не могу найти документацию по этому вопросу.

MyTest.test.js

it('Should return whatever from GET call', () => {
    return request(app).get('/some/endpoint')
        .expect(200)
        .expect(res => {res.body.should.deep.equal(bodyValue)});
    // How would I place code in here to check that MyMiddleware is called? 
    // ie. sinon.assert.calledOnce(MyMiddleware)
});

Я думал об использовании шпиона Синона, но не могу придумать, как подключиться к промежуточному программному обеспечению ... Моя попытка была такой:

const mwSpy = sinon.spy(require('path to middleware file'));

sinon.assert(calledOnce(mwSpy));

1 Ответ

0 голосов
/ 08 февраля 2019

Обычный способ сделать это - разделить его на два теста: интеграционный тест и модульный тест.

  1. Будет ли промежуточное программное обеспечение, указанное мной в router.get вызове, вызываться, когда кто-нибудь достигнет этой конечной точки?
  2. Правильно ли работает мое промежуточное ПО?

Первая часть в основном проверяет, что Express API выполняет то, что говорится в документации. Это не то, для чего предназначены юнит-тесты (это было помечено unit-testing), но поскольку вы уже используете HTTP-запросы для тестирования конечной точки, я думаю, что это не то, что вам нужно в любом случае: вы в основном создаете проверочные тесты для своей системы.

Вы все еще можете протестировать экспресс-маршрутизацию без HTTP, хотя, как Я подробно опишу в ответе на этот вопрос , касающуюся того, как тестировать маршрутизатор программно (более быстрые тесты, без http), но меньше просто придерживаться к тому, что у тебя есть.

Итак, основной вопрос: «Мой квест состоит в том, чтобы проверить, что промежуточное программное обеспечение вызывается один раз из моего модульного теста». Похоже, вы не беспокоитесь о том, работает ли промежуточное программное обеспечение правильно или нет, просто как оно называется, что ставит вопрос о том, следует ли нам тестировать промежуточное программное обеспечение или слой с использованием промежуточного программного обеспечения.

В обоих случаях вам нужно найти способ ввести тестового шпиона. Либо вы пишете небольшой служебный метод, который внедрит этого шпиона: function setMiddleware(module){ middleware = module; }, либо используете какой-либо инструмент, например proxyquire. См. этот урок на домашней странице Синона для фона .

Я бы просто сделал это (в тестовом коде):

it('Should return whatever from GET call', () => {
  var middlewareFake = sinon.fake();
  // I am assuming it's the actual app object you are referencing below in the request(app) line
  var app = proxyquire('../app/index.js', { './my-middleware': middlewareFake });

  //
  return request(app).get('/some/endpoint')
    .expect(200)
    .expect(res => {
      res.body.should.deep.equal(bodyValue)

      expect(middlewareFake).was.called;
    });
});
...