【问题标题】:Mocha how to expose a node controller function to test scriptMocha 如何将节点控制器功能公开给测试脚本
【发布时间】:2023-03-09 13:06:01
【问题描述】:

这是我的foo-controller.js

module.exports = function(params) {

    var router = require('express').Router();
    var db = params.db
    var controller = {};

    controller.getFoo = function (req, res) {
        // returns something
    }

    router.get('/foo', controller.getFoo);

    return router;

};

这是我的test.js

var chai = require('chai');
var expect = require('chai').expect;
var bar = require('../api/controllers/bar/foo-controller');

console.log("Test", bar) // <- this returns the whole foo-controlelr.js

describe('Foo', function() {
    it('should blah blah', function() {

    });
});

但每次我使用bar.getFoo() has no method 'getFoo'

【问题讨论】:

    标签: javascript node.js express mocha.js


    【解决方案1】:

    访问控制器的 getFoo 函数需要您通过 module.exports 导出该函数。但是上面的代码并没有导出控制器而是导出了路由器,因为路由器用于在 express 中安装路由器,所以非常好。

    为了测试您的控制器,您可以将路由/路由定义和控制器拆分到它自己的模块中:

    foo-controller.js

    module.exports = function(params) {
      var db = params.db
      var controller = {};
    
      controller.getFoo = function (req, res) {
        // returns something
      }
      return controller;
    
    };
    

    foo-router.js

    var fooController = require('./foo-controller');
    
    module.exports = function(params) {
    
      var router = require('express').Router();
    
      var controller = fooController(params);
    
      router.get('/foo', controller.getFoo);
    
      return router;
    };
    

    这使您可以在没有路由器的情况下测试控制器。

    另一种测试代码的方法是进行“集成”测试,同时测试路由器和控制器。使用 supertest (https://github.com/visionmedia/supertest) 之类的工具,您可以编写集成测试,如下所示:

    var request = require('supertest');
    var express = require('express');
    var fooRouter = require('.path/to/router/foo');
    
    describe('Foo', function() {
      it('should blah blah', function(done) {
    
        var app = express();
    
        app.use('/', fooRouter(params));
    
        request(app)
          .get('/foo')
          .expect(200)
          .end(function(err, res){
            if (err) throw err;
            done();
          });
        });
      });
    });
    

    这种方法的优点是你的测试路由定义加上控制器。

    【讨论】:

    • 那我应该去掉mocha吗?
    • 不,这个测试仍然使用 mocha(见描述,它)。 Supertest 只是一个小框架,用于测试从 HTTP 请求到控制器逻辑的快速应用程序
    • 哦,我明白了。谢谢你。这对我帮助很大。
    • 还有一个问题,这种方法适用于大型应用程序吗?在controllerrouter格式方面?
    • 这个问题有点过于宽泛,无法在这里回答——可能这更像是一个可以讨论但无法回答的问题。你可以看看github.com/npm/newww,它使用了 hapi,但在拆分路由定义和逻辑方面有一些不错的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    相关资源
    最近更新 更多