Обычный способ сделать это - разделить его на два теста: интеграционный тест и модульный тест.
- Будет ли промежуточное программное обеспечение, указанное мной в
router.get
вызове, вызываться, когда кто-нибудь достигнет этой конечной точки?
- Правильно ли работает мое промежуточное ПО?
Первая часть в основном проверяет, что 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;
});
});