我正在构建一个与Web服务通信的Ruby命令行程序。我正在使用Cucumber和Aruba来测试该程序。问题是我需要控制从Web服务返回的数据;该程序会抓取用户注释流,因此在添加新注释时可能会频繁更改。我尝试使用WebMock来模拟Web服务,但这不起作用,因为Aruba将命令行程序关闭到一个不受WebMock影响的独立进程(因此它仍然与真实进行通信网络服务)。
如何使用Cucumber测试该程序的输出?
编辑:Web服务将流作为JSON数据返回。我已经捕获了用于测试的数据快照;简而言之,我正在寻找一种方法来替换我的静态数据来代替对Web服务的实际调用。
或者,如果有一种完全不同的方式来实现这一目标,我会全力以赴。
答案 0 :(得分:1)
Aruba提供了一种模式,可让您运行“正在处理”的内容,以便您使用WebMock或VCR。这是一篇博客文章,解释了如何做到这一点:
http://georgemcintosh.com/vcr-and-aruba/
或者,您可以考虑编写首先加载VCR或WebMock的新二进制文件,然后加载并执行主二进制文件,并让测试运行此二进制文件。
答案 1 :(得分:0)
你可以使用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。再次运行,VCR将在发出http请求时重播iana.org的响应。此测试现在很快(不再发出真正的HTTP请求),确定性(测试将继续通过,即使您处于脱机状态,或者iana.org需要维护)并且准确(响应将包含相同的标头和你从真实的请求得到的身体。)
答案 2 :(得分:-1)
命令行程序接受参数,因此我编写程序将URL作为指向您想要的任何服务的arg。然后,我将使用不会更改的种子数据制作您的Web服务的测试版本。然后我会写黄瓜测试用测试URL调用程序,并测试预期的数据。