摩卡如何公开一个节点控制器函数来testing脚本

这是我的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() < – 我想testing的function。 它返回错误has no method 'getFoo'

访问控制器的getFoo函数需要你通过module.exports导出这个函数。 但是,上面的代码不会导出控制器,但路由器是完美的,因为路由器是用来安装路由器的。

为了testing你的控制器,你可以将路由/路由定义和控制器分成它自己的模块:

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

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

testing代码的另一种方法可能是进行“集成”testing,一起testing路由器和控制器。 使用像supertest这样的工具( https://github.com/visionmedia/supertest ),你可以编写你的集成testing,就像:

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

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