[英]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.