我为http.Server
的{{3}}编写了一个处理程序(即带有签名function (request, response) { ... }
的函数),我想测试它。我想通过模拟http.ServerRequest
和http.ServerResponse
对象来做到这一点。我该如何创建这些?
显而易见的方式似乎不起作用:
$ node
> var http = require('http');
> new http.ServerRequest();
TypeError: undefined is not a function
at repl:1:9
...
我是否需要通过“真正的”HTTP服务器和客户端进行测试?
答案 0 :(得分:3)
至少有两个项目允许模仿http.ServerRequest
和http.ServerResponse
:https://github.com/howardabrams/node-mocks-http和https://github.com/vojtajina/node-mocks。
由于某种原因,通过真实的HTTP请求进行测试似乎更为常见; https://github.com/flatiron/nock似乎是在这里使用的工具。
答案 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
创建了一个简单的基本模拟,要点为here,http.ServerRequest
为var 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}}库被模拟