首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在nodejs中模拟请求和响应来测试中间件/控制器?

如何在nodejs中模拟请求和响应来测试中间件/控制器?
EN

Stack Overflow用户
提问于 2013-01-24 03:31:01
回答 5查看 45.6K关注 0票数 38

我的应用程序有几个层:中间件、控制器、管理器。控制器接口与中间件1相同:(req,res,next)。

所以我的问题是:如何在不启动服务器并向localhost发送“真正的”请求的情况下测试我的控制器。我想做的是像nodejs一样创建请求和响应实例,然后调用控制器方法。

如下所示:

代码语言:javascript
复制
var req = new Request()
var res = new Response()
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)

任何建议都是非常感谢的。谢谢!

另外,我想这样做的原因是,最后我想测试response对象是否包含正确的jade视图变量。

EN

回答 5

Stack Overflow用户

发布于 2013-01-24 05:58:04

由于JavaScript是一种动态类型的语言,您可以创建模拟对象并将它们传递给控制器,如下所示:

代码语言:javascript
复制
var req = {};
var res = {};
var next = function(err) {console.log('lala')}
controller.get_user(req, res, next)

如果您的控制器需要来自请求或响应对象的特定数据或功能,则需要在模拟中提供此类数据或功能。例如,

代码语言:javascript
复制
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)
票数 10
EN

Stack Overflow用户

发布于 2014-06-15 15:07:20

为此,我会尝试使用dupertest。这是我创建的一个节点模块,目的是为了简化控制器测试,而不必启动新的服务器。

它保留了熟悉的节点模块语法,如requestsupertest,但同样,不需要启动服务器。

它的运行方式很像Hector上面建议的那样,但与Jasmine这样的测试框架集成在一起,让人感觉更无缝。

与您的问题相关的示例可能如下所示:

代码语言:javascript
复制
request(controller.get_user)
  .params({id: user_id})
  .expect(user, done);

或者更明确的手写版本:

代码语言:javascript
复制
request(controller.get_user)
  .params({id: user_id})
  .end(function(response) {
    expect(response).toEqual(user);
    done();
  });

注意:示例假设user_iduser是在某个地方定义的,并且控制器根据id获取并返回一个用户。

编辑:阅读你对上面答案的回应,我承认目前的缺点是这个模块默认情况下没有集成更健壮的模拟请求或响应对象。dupertest使得向reqres扩展和添加属性变得非常容易,但在默认情况下,它们是非常简单的。

票数 5
EN

Stack Overflow用户

发布于 2013-02-05 17:15:15

如果你想使用真实的reqres对象,你必须向服务器发送真实的请求。然而,这比您想象的要容易得多。在express github repo上有很多例子。下面显示了req.route的测试

代码语言:javascript
复制
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);
    })
  })
})
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14487809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档