如何创建模拟http.ServerRequest和http.ServerResponse?

时间:2013-02-22 10:56:09

标签: node.js testing

我为http.Server的{​​{3}}编写了一个处理程序(即带有签名function (request, response) { ... }的函数),我想测试它。我想通过模拟http.ServerRequesthttp.ServerResponse对象来做到这一点。我该如何创建这些?

显而易见的方式似乎不起作用:

$ node
> var http = require('http');
> new http.ServerRequest();
TypeError: undefined is not a function
    at repl:1:9
...

我是否需要通过“真正的”HTTP服务器和客户端进行测试?

3 个答案:

答案 0 :(得分:3)

至少有两个项目允许模仿http.ServerRequesthttp.ServerResponsehttps://github.com/howardabrams/node-mocks-httphttps://github.com/vojtajina/node-mocks

由于某种原因,通过真实的HTTP请求进行测试似乎更为常见; https://github.com/flatiron/nock似乎是在这里使用的工具。

另见node.js: Mock http request and response

答案 1 :(得分:0)

是的,你可以使用http.request来完成。它允许您从服务器发出请求,因此您可以使用您的代码进行测试。如果您想发送简单的GET请求,可以使用http.get,这更容易。否则你必须自己构建你的请求。来自docs的示例:

var options = {
  host: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST'
};

var req = http.request(options, function(res) {
  res.setEncoding('utf8');
  console.log('STATUS: ' + res.statusCode);
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

req.write('data\n');
req.end();

如果您使用request,也可以这样做。

var request = require('request');
request.post( url, json_obj_to_pass,
    function (error, response, body) {
        if (!error && response.statusCode == 200)
            console.log(body)
    }
);

答案 2 :(得分:0)

我为http.ServerResponse创建了一个简单的基本模拟,要点为herehttp.ServerRequestvar require = require('rewire'), events = require('events'), util = require('util'); 我使用rewire

首先加载依赖项:

http.ServerResponse

这是events模拟。它基本上使用与http.ServerResponse相同的方法创建一个对象,然后使用util模块继承/** * Mock https.serverResponse * @type {Object} */ var mockResponse; Eventer = function(){ events.EventEmitter.call(this); this.data = ''; this.onData = function(){ this.emit('data', this.data); } this.setEncoding = function(){ } this.onEnd = function(){ this.emit('end', this.data); } this.run = function(){ this.onData(); this.onEnd(); } }; util.inherits(Eventer, events.EventEmitter); 模块。

/**
 * Mocks literal object for rewire mocking.
 * @see https://github.com/jhnns/rewire
 * @type {Object}
 */
var mocks = {
    "https" : {
        "get" : function(url, fn){
            fn(mockResponse.data);
            mockResponse.run();
        }
    }
};

//instead of: var myModule = require('myModule');
//do:
var myModule = rewire('myModule');
myModule.__set__(mocks);

然后我使用这个带有重新连接的模拟来覆盖http模块的get(),request()或任何其他库。

http

现在模块中的{{1}}库被模拟