36

以下のようなコードを使用して、Savon gem を使用して SOAP リクエストを作成しています。動作していますが、実際にサーバーを呼び出さずにリクエスト XML を表示/キャプチャしたいと考えています。リクエストの後にデバッガー行を貼り付けてクライアント変数を検査することにより、リクエストが行われた後、今すぐ表示できます。

実際にリクエストを行わずにリクエスト XML を表示する方法を知っている人はいますか? Cucumber または Rspec を使用してスキーマに対して XML を検証できるようにしたいと考えています。

client = Savon::Client.new do |wsdl, http|
  wsdl.document = "http://fakesite.org/fake.asmx?wsdl"
end

client.request(:testpostdata, :xmlns => "http://fakesite.org/") do
  soap.header = { :cAuthentication => {"UserName" => "MyName", "Password" => "MyPassword" } }
  soap.body = { :xml_data => to_xml }
end
4

7 に答える 7

52

Savon 2 を使用して、クライアントからのリクエスト ボディを返すメソッドを記述します。

 client = Savon::Client.new(....)

これはドキュメントには記載されていません

  def get_request
     # list of operations can be found using client.operations
     ops = client.operation(:action_name_here)

     # build the body of the xml inside the message here        
     ops.build(message: { id: 42, name: "Test User", age: 20 }).to_s
  end
于 2014-08-02T05:39:45.543 に答える
13

これを行うためのより良い方法があると確信していますが、応答を上書きしました。

class Savon::SOAP::Request
  def response
    pp   self.request.headers
    puts
    puts self.request.body
    exit
  end
end
于 2011-05-19T11:25:26.637 に答える
10

They've updated the API since the last post. Set this setting in Savon.client: :pretty_print_xml => true. After your call, search the logs for SOAP request:. The output is put to stdout. Check the console console history if you're testing your connection from the console.

于 2013-05-16T21:22:47.877 に答える
8

SavonHTTPIを使用して SOAP リクエストを実行します。HTTPI は、さまざまな Ruby HTTP クライアント上の共通インターフェースです。次の方法で、Savon によって実行された HTTP リクエストをモック/スタブすることができます。

HTTPI.expects(:post).with do |http|
  SchemaValidation.validate(:get_user, http.body)
end

SOAPリクエストをモックし、HTTPボディを取得し、いくつかの検証方法(疑似コード)に対して検証するためにMochaを使用したことに注意してください。

現在、Savon はリクエストを実行せずに構築することをサポートしていません。したがって、リクエストを検証する唯一の方法は、リクエストを傍受することです。

この機能をサポートするために Savon が必要な場合は、私に知らせて、GitHub でチケットを開いてください。

編集: savon_specもあります。これは、Savon を使用した基本的なフィクスチャ ベースのテストの小さなヘルパーです。

于 2011-05-02T20:20:06.153 に答える
7

私は同じ問題を抱えていて、次のようにSavonにパッチを当てました:

module Savon
  class Client
    def get_request_xml operation_name, locals
      Savon::Builder.new(operation_name, @wsdl, @globals, locals).pretty
    end
  end
end

これにより、XML が構築され、API エンドポイントに送信せずに文字列として返されます。client.call と同じようにブロック引数を受け入れないため、作成しているすべてのタイプのリクエストを再現することはできませんが、今のところ私のニーズを満たしています。

于 2013-10-18T23:47:44.323 に答える