模拟HTTP响应以测试node.js HTTP客户端

时间:2011-01-21 13:36:58

标签: http node.js

如何模拟HTTP响应来测试应用?

我想做的是模拟HTTP响应以测试HTTP node.js客户端。有什么我可以使用fakeweb,但对于node.js?

7 个答案:

答案 0 :(得分:4)

为什么不使用node.js服务器?它们写起来很简单,可以让你完全控制响应。

这是一个例子,直接来自http://nodejs.org/

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');

答案 1 :(得分:2)

我们以前使用的是定制的HTTP虚拟服务器,但最近切换到了这个:

https://github.com/pgte/nock

答案 2 :(得分:1)

如果我理解了你可以使用nock(https://github.com/pgte/nock)来模拟来自给定路线的虚假HTTP响应的问题。

如果你使用should.js(https://github.com/visionmedia/should.js/)进行断言的例子,请求请求(lol)可能是这样的:

should = require 'should'
nock = require 'nock'
request = require 'request'
require '../../app.coffee'

// just a mock obj to reply
mockObj = 
    id: 42

mockRoute = nock 'http://www.mock.com.br'
    .get '/path/you/want/to/mock'
    .reply 200, mockObj

describe "Mock API", ->

    describe "Mock route", ->

        it "should return 200 OK and mockObj.id 42", (done) ->
        // Arranges test URL
        testUrl = "http://www.testurl.com.br:3000/path/you/want/to/test"
        expectedObj =
            id: 42

    request.get testUrl, (error, response, body) ->

        // compares expected response's statusCode with received
        response.should.have.status 200
            expected.should.eql JSON.parse(body)

这仅仅是一个例子,对于生产测试来说有点差,但我认为它是一个很好的例子来说明它是如何工作的。

但是在这种情况下,就像我测试我在端口3000上运行的是否能够处理请求testUrl并将请求转换为模拟路由的请求一样在我打电话给testUrl时,我希望到达并确保节点正在接收它。

希望它有所帮助。

编辑:代码在coffeescript中(如果有人不知道的话)。如果你愿意,可以使用JS - > https://gist.github.com/marcoagner/9501662

编辑2:甚至没有查看日期..要睡觉:P对不起。如果它能帮助那里的人,请将它放在这里。哈哈哈

答案 3 :(得分:0)

这里描述了各种工具和机制:

http://wiki.apache.org/httpd/WatchingHttpHeaders

实际上,该页面主要侧重于观看正在进行的http对话。我建议您尝试使用netcatcadaver来生成自己的自定义请求。

netcat使用的简短示例:

$ printf "GET\n\n" |nc localhost 80
<html><body><h1>It works!</h1></body></html>

修改 卫生署!我刚刚意识到您要模拟响应而非请求,抱歉。不过,Netcat仍然可以用于此目的。将其设置为聆听,您可以完全控制其输出。

答案 4 :(得分:0)

对于Ruby,如果你想在rails之外使用,你可能会看看rails附带的功能测试代码,例如,它允许在test :: unit周围有一组很好的包装来访问http方法。对于node.js或ruby,您可以使用黄瓜来测试工作流并让webdriver访问页面。 Cucumber与您选择的Web驱动程序(webrat,selenium,celerity,waiter等)一起使用,并且可以访问HTTP请求,响应和标头。

http://cukes.info

答案 5 :(得分:0)

Expresso通过扩展assert模块提供此功能:

assert.response(server, {
    url: '/',
    method: 'GET'
},{
    body: '{"name":"tj"}',
    status: 200,
    headers: {
        'Content-Type': 'application/json; charset=utf8',
        'X-Foo': 'bar'
    }
});

这适用于内置的node.js http服务器。它具有不需要监听服务器的优点。缺点可能是它需要您使用其他的expresso测试框架。

http://visionmedia.github.com/expresso/

答案 6 :(得分:0)

我自己没有尝试过,但这是我发现的一个模块,它说的就是这样:https://github.com/howardabrams/node-mocks-http