Ruby on rails Rspec、sham_rack和Savon 2

Ruby on rails Rspec、sham_rack和Savon 2,ruby-on-rails,ruby,rspec,savon,Ruby On Rails,Ruby,Rspec,Savon,我正在尝试将我们的Savon(从版本1)更新到版本2。我们有一个特性测试,它加载一个页面,该页面点击触发Savon的方法。萨沃恩似乎工作得很好 但是,我们有一个支持文件,它使用sham_rack截获此请求并返回一些默认信息。在SavonV1中一切都很好,但在V2中就不行了。它似乎根本不会触发,我也不确定我的代码、sham_rack或Savon是否有问题 #Savon呼叫 def客户端 @顾客,顾客 Settings.savon#一个YML文件,包含用于打开日志等的内容 端点'http://www

我正在尝试将我们的Savon(从版本1)更新到版本2。我们有一个特性测试,它加载一个页面,该页面点击触发Savon的方法。萨沃恩似乎工作得很好

但是,我们有一个支持文件,它使用sham_rack截获此请求并返回一些默认信息。在SavonV1中一切都很好,但在V2中就不行了。它似乎根本不会触发,我也不确定我的代码、sham_rack或Savon是否有问题

#Savon呼叫
def客户端
@顾客,顾客
Settings.savon#一个YML文件,包含用于打开日志等的内容
端点'http://www.site.local/SomeService.svc?wsdl=wsdl10'
名称空间'http://www.somesite.com/URL/1.0'
名称空间'xmlns:ns'=>'http://www.somesite.com/URL/1.0',
'xmlns:arr'=>'http://schemas.microsoft.com/2003/10/Serialization/Arrays'
漂亮的打印xml真的吗
结束
结束
#这里的操作是“GetAllItems”
def do_collections_server_请求(主体、操作、选项={})
选项。反向合并!(raise_错误:true)
client.globals.raise\u错误(选项[:raise\u错误])
client.globals.headers('SOAPAction'=>http://www.somesite.com/URL/1.0/IService/#{行动}”)
client.call(操作、消息:body)
结束
#spec/support/sham_calls.rb
需要“nokogiri”
ShamRack.at('www.site.local')。sinatra do
post'/SomeService.svc'do
if request.env['HTTP_SOAPACTION'].包括吗GetAllItems'
返回准备好的xml
结束
结束
结束
我可以在ShamRack.at块的开头放一条消息,当它加载时就会触发。但它似乎永远不会触发帖子。这一切都适用于Savon 1(当然,除了为了使Savon正常工作而必须进行的更改)。而且它似乎贴到了终点。ShamRack只是没有抓住它。我做错了什么

Ruby 2.1.1

宝石:


经过大量调查,我相信Savon可能是在另一个线程中运行的。沙姆拉克说:

有什么问题吗?您的机架请求处理代码与您的请求在同一个Ruby VM中运行,实际上是在同一个线程中运行

我相信这就是为什么我的Savon请求没有被Sinatra抓住的原因。我们的应用程序中还有一个更直接的呼叫,ShamRack仍能捕捉到这一点

最后,我搬到VCR来解决这个问题

如果其他人对此有一个解决方案,我很想听听,但我不知道现在我们正在开发VCR,我是否有时间来解决这个问题

rails (3.2.18)
sham_rack (1.3.6)
savon (2.3.3)
      akami (~> 1.2.0)
      builder (>= 2.1.2)
      gyoku (~> 1.1.0)
      httpi (~> 2.1.0)
      nokogiri (>= 1.4.0)
      nori (~> 2.3.0)
      wasabi (~> 3.2.2)