我的应用程序有几个层:中间件、控制器、管理器。控制器接口与中间件1相同:(req,res,next)。
所以我的问题是:如何在不启动服务器并向localhost发送“真正的”请求的情况下测试我的控制器。我想做的是像nodejs一样创建请求和响应实例,然后调用控制器方法。
如下所示:
var req = new Request()
var res = new Response()
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)
任何建议都是非常感谢的。谢谢!
另外,我想这样做的原因是,最后我想测试response对象是否包含正确的jade视图变量。
发布于 2013-01-24 05:58:04
由于JavaScript是一种动态类型的语言,您可以创建模拟对象并将它们传递给控制器,如下所示:
var req = {};
var res = {};
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)
如果您的控制器需要来自请求或响应对象的特定数据或功能,则需要在模拟中提供此类数据或功能。例如,
var req = {};
req.url = "http://google.com"; // fake the Url
var res = {};
res.write = function(chunk, encoding) {
// fake the write method
};
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)
发布于 2014-06-15 15:07:20
为此,我会尝试使用dupertest。这是我创建的一个节点模块,目的是为了简化控制器测试,而不必启动新的服务器。
它保留了熟悉的节点模块语法,如request
或supertest
,但同样,不需要启动服务器。
它的运行方式很像Hector上面建议的那样,但与Jasmine这样的测试框架集成在一起,让人感觉更无缝。
与您的问题相关的示例可能如下所示:
request(controller.get_user)
.params({id: user_id})
.expect(user, done);
或者更明确的手写版本:
request(controller.get_user)
.params({id: user_id})
.end(function(response) {
expect(response).toEqual(user);
done();
});
注意:示例假设user_id
和user
是在某个地方定义的,并且控制器根据id获取并返回一个用户。
编辑:阅读你对上面答案的回应,我承认目前的缺点是这个模块默认情况下没有集成更健壮的模拟请求或响应对象。dupertest
使得向req
和res
扩展和添加属性变得非常容易,但在默认情况下,它们是非常简单的。
发布于 2013-02-05 17:15:15
如果你想使用真实的req
和res
对象,你必须向服务器发送真实的请求。然而,这比您想象的要容易得多。在express github repo上有很多例子。下面显示了req.route
的测试
var express = require('../')
, request = require('./support/http');
describe('req', function(){
describe('.route', function(){
it('should be the executed Route', function(done){
var app = express();
app.get('/user/:id/edit', function(req, res){
// test your controllers with req,res here (like below)
req.route.method.should.equal('get');
req.route.path.should.equal('/user/:id/edit');
res.end();
});
request(app)
.get('/user/12/edit')
.expect(200, done);
})
})
})
https://stackoverflow.com/questions/14487809
复制相似问题