【问题标题】:Unit test express route calls controller method?单元测试快速路由调用控制器方法?
【发布时间】:2015-03-11 15:33:43
【问题描述】:

我看到了一些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 的回调?或者我应该以某种方式重组应用程序(我看到了许多其他配置路由的方法)?

【问题讨论】:

    标签: node.js unit-testing express sinon


    【解决方案1】:

    我建议不要这样做,而是检查从 /menu 返回的响应代码,并检查响应本身是否符合或包含已知响应。

    【讨论】:

    • 这更像是一个集成测试。虽然,我理解你在说什么,并且对实际的 server.js 和 menuController 进行了单元测试。所以是的,我正在检查响应代码(即控制器方法的实现)。但我还想测试路由配置是否正确 - 例如:有人去更改路由,可能是错字,所以测试会出错。
    【解决方案2】:

    这不是真正的单元测试,但您可以这样做:

    像这样使用依赖注入:

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

    然后将 fake 作为 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) {});
    });
    

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多