2011-01-21 187 views
3

如何模拟HTTP响应以测试应用程序?模拟HTTP响应以测试node.js HTTP客户端

谢谢!

编辑:我知道有一个虚假的HTTP响应的开源应用程序。我不记得它是ruby还是node.js,但这是我想知道的。对困惑感到抱歉。

EDIT2:https://github.com/chrisk/fakeweb

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

+0

请稍微具体一点。如果没有一些解释,标记ruby和node.js并不是真的有用。 – 2011-01-21 13:40:23

回答

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/'); 
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对此仍然有用。设置它来监听并完全控制其输出。

0

对于Ruby,如果你想使用rails以外的地方,你可以看一下rails中包含的功能测试的代码,例如,它允许围绕test :: unit用一个很好的包装来访问http方法。对于node.js或ruby,您都可以使用cucumber来测试工作流程并让webdriver访问这些页面。黄瓜与您选择的网络驱动程序(webrat,selenium,celerity,waiter等)一起工作,并可以访问HTTP请求,响应和头文件。

http://cukes.info

0

快报通过扩展断言模块提供本:

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/

1

如果我深知你可以使用诺克(https://github.com/pgte/nock)嘲笑从给定路线假的HTTP响应的问题。

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

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对不起。只是让它在这里,以防止有人在那里。哈哈哈