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();
});
});
});
});
这种方式的好处是你的测试路由定义加上控制器。
这是我的 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();
});
});
});
});
这种方式的好处是你的测试路由定义加上控制器。