【问题标题】:How can I test a Ruby command-line program that communicates with a web service?如何测试与 Web 服务通信的 Ruby 命令行程序?
【发布时间】:2012-12-04 22:34:31
【问题描述】:

我正在构建一个与 Web 服务通信的 Ruby 命令行程序。我正在使用 Cucumber 和 Aruba 来测试程序。问题是我需要控制从 Web 服务返回的数据;该程序会抓取用户 cmets 流,因此在添加新 cmets 时会经常更改。我尝试使用 WebMock 模拟 Web 服务,但这不起作用,因为 Aruba 将命令行程序转为不受 WebMock 影响的单独进程(因此它仍然与 real网络服务)。

如何使用 Cucumber 测试该程序的输出?


编辑:Web 服务将流作为 JSON 数据返回。我已经捕获了用于测试的数据快照;简而言之,我正在寻找一种方法来替换我的静态数据来代替对 Web 服务的实际调用。

或者,如果有完全不同的方式来实现这个目标,我会全力以赴。

【问题讨论】:

  • 如果一切都失败了,您应该能够通过您的 hosts 文件将请求重定向到为捕获的 JSON 数据提供服务的本地 Web 服务。但我希望有人能提出比这更好的解决方案:)
  • @doesterr:哈哈,是的,我考虑过。但我不知道我是否可以期望其他可能想要或需要测试它的人也这样做。 ;)
  • 对,这是万不得已的“解决方案”:)

标签: ruby cucumber aruba webmock


【解决方案1】:

Aruba 提供了一种模式,可让您在“进程中”运行事物,从而允许您使用 WebMock 或 VCR。这是一篇博客文章,解释了如何做到这一点:

http://georgemcintosh.com/vcr-and-aruba/

或者,您可以考虑编写一个新的二进制文件,首先加载 VCR 或 WebMock,然后加载并执行您的主二进制文件,并让您的测试运行此二进制文件。

【讨论】:

    【解决方案2】:

    您可以使用 vcr(参见https://github.com/vcr/vcr

    它会将你的 json 响应变成一个夹具。

    我将复制他们自述文件的开头,以便您了解:


    require 'rubygems'
    require 'test/unit'
    require 'vcr'
    
    VCR.configure do |c|
      c.cassette_library_dir = 'fixtures/vcr_cassettes'
      c.hook_into :webmock # or :fakeweb
    end
    
    class VCRTest < Test::Unit::TestCase
      def test_example_dot_com
        VCR.use_cassette('synopsis') do
          response = Net::HTTP.get_response(URI('http://www.iana.org/domains/reserved'))
          assert_match /Example domains/, response.body
        end
      end
    end
    

    运行此测试一次,VCR 会将 http 请求记录到 fixtures/vcr_cassettes/synopsis.yml。再次运行它,当发出 http 请求时,VCR 将重播来自 iana.org 的响应。这个测试现在很快(不再发出真正的 HTTP 请求)、确定性(测试将继续通过,即使您处于离线状态或 iana.org 因维护而关闭)且准确(响应将包含相同的标头和您从真实请求中获得的正文)。

    【讨论】:

    • 您是否错过了问题中的“另一个过程”详细信息?
    【解决方案3】:

    命令行程序接受参数,所以我会编写程序以将 URL 作为指向您想要的任何服务的 arg。然后,我将使用不变的种子数据制作您的 Web 服务的测试版本。然后我会编写黄瓜测试以使用测试 URL 调用程序,并针对预期数据进行测试。

    【讨论】:

    • web服务其实是通过第三方库调用的;更改 URL 不是一种选择。
    • 评论流是否包含任何元数据?我认为可以测试日期时间(或其一部分)之类的东西。
    • 它以 JSON 提要的形式返回;我已经捕获了对文件的一个这样的响应,我只是在寻找一种方法来替换我的静态数据来代替对 Web 服务的实际调用。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多