2015-03-11 5 views
2

Я вижу несколько similar questions, но моя настройка немного отличается, и я не могу найти хороший способ проверить это.Экспресс-метод экспресс-маршрута вызовов контроллера?

Я пытаюсь проверить, что мои экспресс-маршруты приложений направлены на правильные методы управления.

Например -

//server.js, base application 

var express = require("express"); 
var app = express(); 
require("./routes.js")(app); 
... 

//routes.js 
var menuController = require("./controllers/menu.js"); 

module.exports = function(expressApp) { 
    expressApp.get('/menu', menuController.getMenu); 
}; 
... 

//test file 
var express = require('express') 
    , menuController = require("../../controllers/menu.js") 
    , chai = require('chai') 
    , should = chai.should() 
    , sinon = require('sinon') 
    , sinonChai = require("sinon-chai"); 
chai.use(sinonChai); 

var app = express(); 
require("../../routes/routes.js")(app); 

describe('routes.js', function(){ 

    it('/menu should call menuController.getMenu route', function(){ 
     var spy = sinon.spy(menuController, 'getMenu'); 
     app.get('/menu', spy); 

     spy.should.have.been.called; //fails, never called 
    }); 

}); 

Как я могу проверить, что при вызове app.get ('/' меню, ..), обратный вызов от menuController вызывается? Или мне нужно каким-то образом изменить структуру приложения (я вижу несколько других способов настройки маршрутизации)?

ответ

0

Вместо этого я бы предложил проверить код ответа, который возвращается с /menu, а также проверить сам ответ, который он запрашивает или содержит известный ответ.

+0

Это будет скорее интеграционный тест. Хотя, я понимаю, что вы говорите, и имеет модульные тесты для фактического server.js и menuController. Так что да, я освещаю проверку кодов ответов (т. Е. Реализацию методов контроллера). Но я также хочу проверить, правильно ли настроены маршруты - например: кто-то идет и меняет маршрут, может быть, опечатка, поэтому тест будет ошибкой. –

0

Это не будет действительно модульного тестирования, но вы можете сделать это, таким образом:

инъекции Использование зависимостей, как это:

function bootstrapRouterFactoryMethod(bootstrapController) { 
    var router = express.Router(); 
    router.route('/').post(bootstrapController.bootstrap); 
    return router; 
}; 

module.exports = bootstrapRouterFactoryMethod; 

, а затем передать фальшивый как bootstrapController и проверить, является ли метод начальной загрузки называется.

var request = require('supertest'); 

... 

it('calls bootstrapController #bootstrap', function (done) { 
    var bootstrapControllerFake = { 
     bootstrap: function(req, res) { 
      done(); 
     } 
    }; 
    var bootstrapRouter = bootstrapRouterFactoryMethod(bootstrapControllerFake); 
    app.use(bootstrapRouter); 
    request(app).post('/').end(function (err, res) {}); 
}); 
Смежные вопросы