【问题标题】:Simulate HTTP responses to test a node.js HTTP client模拟 HTTP 响应以测试 node.js HTTP 客户端
【发布时间】:2011-06-13 03:55:17
【问题描述】:

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

我想做的是模拟 HTTP 响应来测试 HTTP node.js 客户端。有没有我可以使用的东西,比如fakeweb,但对于 node.js?

【问题讨论】:

  • 请更具体一点。如果没有一些解释,标记 ruby​​ 和 node.js 并没有真正的帮助。

标签: http node.js


【解决方案1】:

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

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

实际上,该页面主要关注正在进行的 http 对话。我建议尝试netcatcadaver 来生成您自己的自定义请求。

netcat 用法的简短示例:

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

编辑 嗬!我刚刚意识到你想模拟 responses 而不是 requests,抱歉。不过,Netcat 对此仍然有用。将其设置为监听,您可以完全控制其输出。

【讨论】:

    【解决方案2】:

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

    http://cukes.info

    【讨论】:

      【解决方案3】:

      为什么不使用 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/');
      

      【讨论】:

        【解决方案4】:

        Expresso 通过扩展断言模块来提供此功能:

        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/

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我们之前使用的是定制的 HTTP 虚拟服务器,但最近改用了这个:

            https://github.com/pgte/nock

            【讨论】:

              【解决方案7】:

              如果我能很好地理解这个问题,您可以使用 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

              Edit2:甚至没有查看日期.. 得睡觉了:P 对不起。只是让它在这里,以防它帮助那里的人。哈哈哈

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-14
                • 2012-01-27
                • 2017-01-08
                • 1970-01-01
                • 2016-04-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多