Mocha如何公开节点控制器函数来测试脚本

时间:2016-01-26 09:44:06

标签: javascript node.js express mocha

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

1 个答案:

答案 0 :(得分:1)

访问控制器的getFoo函数需要您通过module.exports导出此函数。但上面的代码不会导出控制器,但路由器完全正常,因为路由器用于在快递中安装路由器。

为了测试您的控制器,您可以在其自己的模块中分割路由/路由定义和控制器:

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

这种方法的优点是您的测试路线定义加控制器。