Mocha如何将节点控制器功能暴露给测试脚本

Mocha how to expose a node controller function to test script

这是我的 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() <- 我想测试的功能。它returns错误has no method 'getFoo'

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

为了测试你的控制器,你可以在它自己的模块中拆分 routing/route 定义和控制器:

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

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

另一种测试代码的方法是进行 "integration" 测试,同时测试路由器和控制器。使用 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();
      });
    });
  });
});

这种方式的好处是你的测试路由定义加上控制器。