0

我已经为http.Server请求事件(即带有签名的函数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 服务器和客户端对此进行测试?

4

3 回答 3

3

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

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

另请参阅node.js:模拟 http 请求和响应

于 2013-02-25T13:50:51.137 回答
0

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

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();

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

var request = require('request');
request.post( url, json_obj_to_pass,
    function (error, response, body) {
        if (!error && response.statusCode == 200)
            console.log(body)
    }
);
于 2013-02-22T16:03:45.020 回答
0

我创建了一个简单和基本的模拟http.ServerResponse,要点就在这里http.ServerRequest我使用rewire

首先加载依赖:

var require = require('rewire'),
    events = require('events'),
    util = require('util');

这是http.ServerResponse模拟。它基本上创建了一个与 http.ServerResponse 方法相同的对象,然后events使用该模块继承该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);

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

/**
 * 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你模块中的库被模拟了

于 2013-12-19T19:20:22.443 回答