4

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

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


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

或者,如果有完全不同的方式来实现这个目标,我会全神贯注。

4

3 回答 3

1

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

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

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

于 2013-12-12T07:28:07.523 回答
0

You could use vcr (cf. https://github.com/vcr/vcr)

It will turn your json response into a fixture.

I will copy the beginning of their Readme so you can get the idea:


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

Run this test once, and VCR will record the http request to fixtures/vcr_cassettes/synopsis.yml. Run it again, and VCR will replay the response from iana.org when the http request is made. This test is now fast (no real HTTP requests are made anymore), deterministic (the test will continue to pass, even if you are offline, or iana.org goes down for maintenance) and accurate (the response will contain the same headers and body you get from a real request).

于 2013-12-11T16:55:38.867 回答
-1

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

于 2012-12-04T22:43:14.803 回答