Я изучаю Node.js и играю с Express . Мне очень нравится фреймворк; однако мне сложно понять, как написать тест модуля / интеграции для маршрута.
Возможность модульного тестирования простых модулей проста, и мы уже делали это с помощью Mocha ; однако мои модульные тесты с Express терпят неудачу, поскольку объект ответа, который я передаю, не сохраняет значения.
Тестируемая функция маршрута (routes / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Модуль модульного тестирования:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Когда я запускаю это, он не дает «Ошибка: обнаружены глобальные утечки: viewName, data».
Где я ошибаюсь, чтобы заставить это работать?
Есть ли лучший способ провести модульное тестирование моего кода на этом уровне?
Обновление 1. Исправлен фрагмент кода, так как я изначально забыл "it ()".
Как другие рекомендовали в комментариях, похоже, что канонический способ тестирования контроллеров Express - это супертест .
Пример теста может выглядеть так:
Плюс: вы можете протестировать весь свой стек за один раз.
Оборотная сторона: это похоже на интеграционное тестирование и действует так же.
источник
integration
, и, возможно, маршруты тестирования следует оставить на усмотрение интеграционных тестов. Я имею в виду, что функциональность маршрутов, соответствующих их определенным обратным вызовам, предположительно уже протестирована express.js; любая внутренняя логика для получения окончательного результата маршрута в идеале должна быть модульной вне ее, и эти модули должны быть модульно протестированы. Их взаимодействие, т. Е. Маршрут, следует тестировать на интеграцию. Вы бы согласились?Я пришел к выводу, что единственный способ действительно модульного тестирования экспресс-приложений - это поддерживать значительное разделение между обработчиками запросов и вашей базовой логикой.
Таким образом, логика вашего приложения должна быть в отдельных модулях, которые можно
require
тестировать и тестировать отдельно , и иметь минимальную зависимость от классов Express Request и Response как таковых.Затем в обработчиках запросов вам нужно вызвать соответствующие методы классов базовой логики.
Я приведу пример, как только закончу реструктуризацию моего текущего приложения!
Я думаю что-то вроде этого? (Не стесняйтесь изложить суть или комментарий, я все еще изучаю это).
редактировать
Вот крошечный пример, встроенный. См. Суть для более подробного примера.
источник
Самый простой способ проверить HTTP с помощью express - украсть http-помощник TJ.
Я лично использую его помощник
Если вы хотите специально протестировать свой объект маршрутов, передайте правильные макеты
источник
если модульное тестирование с экспресс-4, обратите внимание на этот пример от gjohnson :
источник
Мне тоже было интересно, но специально для модульных, а не интеграционных тестов. Это то, что я делаю прямо сейчас,
Где как раз есть routerObj
{router: expressRouter, path: '/api'}
. Затем я загружаю подмаршрутизаторы с помощью,var loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
а затем экспресс-приложение вызывает функцию инициализации, принимая экспресс-маршрутизатор в качестве параметра. Затем initRouter вызываетrouter.use(loginRouterInfo.path, loginRouterInfo.router);
для монтирования субмаршрутизатор.Субмаршрутизатор можно протестировать с помощью:
источник
Чтобы выполнить модульное тестирование вместо интеграционного тестирования, я имитировал объект ответа обработчика запросов.
Затем, чтобы выполнить интеграционное тестирование, вы можете смоделировать свой endpointHandler и вызвать конечную точку с помощью supertest .
источник
В моем случае единственное, что я хотел проверить, это то, был ли вызван правый обработчик. Я хотел использовать супертест, чтобы оценить простоту выполнения запросов к промежуточному программному обеспечению маршрутизации. Я использую Typescript a, и это решение, которое сработало для меня
Маршруты
Тесты
У меня возникли проблемы с тем, чтобы заставить насмешку работать. но использование jest.doMock и определенный порядок, который вы видите в примере, заставляют его работать.
источник