这是我的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'
答案 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();
});
});
});
});
这种方法的优点是您的测试路线定义加控制器。