繁体   English   中英

使用RSpec在Ruby on Rails中测试Thrift代码的最佳方法是什么

[英]What is the best way to test Thrift code in Ruby on Rails using RSpec

我有一个使用Thrift与客户端通信的Ruby on Rails应用程序。 现在,我将代码保存在控制器中,每当客户端在特定路径上调用POST ,它将重定向到我的控制器,并在其中创建Thrift传输对象,如下所示:

transport = Thrift::IOStreamTransport.new request.body, response.stream

然后使用处理器和普通的旧红宝石对象作为处理程序。

但是,我需要测试该控制器(使用RSpec)。

我不能只使用客户端代码,因为客户端代码希望服务器正在运行,并且在测试环境中不可用。

关于如何在RSpec中测试Thrift代码的任何想法?

如果IOStreamTransport的响应不重要,而仅仅是构建传输并在其上调用某些内容,请考虑模拟传输。


let(:fake_transport) { double("fake_transport") }
before do
  expect(Thrift::IOStreamTransport).to receive(:new).with(request.body, anything).and_return(fake_transport)
  expect(Processor).to receive(:new).with(fake_transport).and_return(true)
end

有人可能会说这将您绑定到实现上-但是您已经很好地将职责封装在了经过测试的对象中,因此您应该期望使用它们。

另一种选择是使用类似webmock的东西来构建假响应。 如果您要进行集成测试,这也可以进行集成测试。

因此,深入研究Thrift库和RSpec的工作原理,我想出了一种使用自定义Transport的解决方法

class TestTransport < Thrift::BaseTransport
  def initialize(delegate)
    @delegate = delegate
    @outbuf = Thrift::Bytes.empty_byte_buffer
  end

  def open?; true end
  def read(sz); @inbuf.read sz end
  def write(buf); @outbuf << Thrift::Bytes.force_binary_encoding(buf) end

  def flush
    @delegate.request.accept = "application/vnd.app.v1+x-thrift-json"
    @delegate.post :handle, @outbuf
    data = @delegate.response.body
    data = Thrift::Bytes.force_binary_encoding(data)
    @inbuf = StringIO.new data
    @outbuf = Thrift::Bytes.empty_byte_buffer
  end
end

这段代码大部分是从Thrift的HTTPClientTransport复制而来的,在哪里调用NetIO进行发布,我只是在Delegate上进行发布,而后者只是RSpec对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM