单元测试快速路由呼叫控制器方法?

时间:2015-03-11 15:33:44

标签: node.js unit-testing express sinon

我看到一些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('/ menu',..)时查看是否会调用menuController的回调?或者我应该以某种方式重构应用程序(我看到一些其他方法来配置路由)?

2 个答案:

答案 0 :(得分:0)

我会建议检查从/menu返回的响应代码,并检查响应本身是否需要它还是包含已知响应。

答案 1 :(得分:0)

它不会成为真正的单元测试,但你可以这样做:

使用依赖注入:

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

module.exports = bootstrapRouterFactoryMethod;

然后将false作为bootstrapController传递并验证是否调用了bootstrap方法。

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) {});
});