如何在节点中创建请求和响应对象

时间:2016-12-01 04:48:33

标签: node.js unit-testing express nock

我试图为我的节点/快速处理程序模拟请求和响应对象。我尝试了一些模拟库,并遇到了API兼容性问题,这使得它们在测试时太不可靠了。

我想做的是自己创建原始请求和响应对象,并将输出定向到除实时连接之外的其他位置。

这是我到目前为止所拥有的:

env.mockReq = function(o){
    o = o || {};
    o.hostname = 'www.tenor.co';
    o.protocol = 'https';
    o.path = o.url;
    o.createConnection = function(){
        console.log('mockReq createConnection');
    };
    var req = new http.ClientRequest(o);
    req.url = o.url;
    req.method = o.method;
    req.headers = o.headers || {};
    return req;
};
env.mockRes = function(o){
    var res = new http.ServerResponse({
        createConnection: function(){
            console.log('mockRes createConnection');
        }
    });
    return res;
};

这是一些测试代码:

var req = env.mockReq({method: 'GET', url: '/'});
var res = env.mockRes();


res.on('end', function(arguments){
    expect(this.statusCode).toBe(200);
    expect(this._getData().substr(-7)).toEqual('</html>');
    scope.done();
    done();
});

// my express app
app.handle(req, res);

我的处理程序正在将流数据源传递给响应:

stream.pipe(response);

我在浏览器中加载请求时工作正常,但我的测试超时,因为响应end事件永远不会被触发。我应该注意到,我的处理程序中的日志语句正在测试中,并且它一直到最后完成。

为了使问题复杂化,我使用nock来模拟一些API请求。我必须添加以下内容以防止出错:

// Prevents "Error: Protocol "https" not supported. Expected "http:""

nock('http://www.example.com')
.persist()
.get('/non-existant-path')
.reply(function(uri, requestBody) {
    console.log('nock path:', this.req.path);
    return ''
});

然而,实际上从来没有调用过nock回调。但是如果没有这段代码,即使我不使用https,也会收到错误。我的网站的实时版本将所有流量重定向到https,因此可能正在进行实时连接,但为什么我的处理程序正在执行?

0 个答案:

没有答案