3

内部 RESTful API の認証をテストするために使用されるハッシュを生成する次のコードがあります。

問題は、生成されたハッシュがエスケープされた値を返すことです。

json_headersメソッドは次のようなものを返す必要があります。

{"Authorization"=>"Basic ZnBfZXJwOllrdGh4aHRSZTZWM1d1d09oeVlmcW0xTg==", "Accept"=>"application/json"} 

しかし戻ってきます:

{\"Authorization\"=>\"Basic ZnBfZXJwOllrdGh4aHRSZTZWM1d1d09oeVlmcW0xTg==\\n\", \"Accept\"=>\"application/json\"}

Rubyハッシュから生のキー/値を返す簡単な方法を知っている人はいますか?

コードは次のとおりです。

module ERP
  class CustomersMock

    def json_headers
      authorization_hash.merge("Accept"=>"application/json")
    end

    def authorization_hash 
      {"Authorization" => "Basic #{base64_user_pass}"}
    end

    def user_pass
       # user:password
       [ ERP_CONF['user'], ERP_CONF['password'] ].join(':')
    end

    def base64_user_pass
      Base64.encode64(user_pass)
    end

    def add(customer)
      customers << customer
    end        

    def customers
      []
    end         

    def run
      ActiveResource::HttpMock.respond_to do |mock|
        customers.each do |customer|
          mock.get "/customers/#{customer.id}.json", json_headers, customer.to_json
        end
      end
    end
  end
end

何らかの理由で、ヘッダー ハッシュを所定の場所にハードコーディングすると機能しますが、json_headersメソッドを呼び出すと、respond_toブロックはそれらを文字列に変換し、値をエスケープします。

rspec の失敗は次のとおりです。

Could not find a response recorded for <GET: /api/customers/1011.json [{"Authorization"=>"Basic ZnBfZXJwOllrdGh4aHRSZTZWM1d1d09oeVlmcW0xTg==", "Accept"=>"application/json"}] ()> - Responses recorded are: ["<GET: /api/customers/1011.json [{\"Authorization\"=>\"Basic ZnBfZXJwOllrdGh4aHRSZTZWM1d1d09oeVlmcW0xTg==\\n\", \"Accept\"=>\"application/json\"}] ()>"]
4

2 に答える 2

3

エスケープされた引用符は、最初は少し混乱します。IRB や Pry などの REPL からこれをテストしていたと思います。メソッドには実際には通常の二重引用符が含まれています。二重引用符は文字列の先頭と末尾を示すために既に使用されているため、出力用にエスケープされるだけです。つまり、実際に二重引用符文字"を文字列に格納したい"\""場合は、入力する必要があります。入力"""すると、実際には文字列が 2 番目の". 実際に文字列をputs. これを例で示しましょう。

require 'json'

h = {a: 123, b: 456}

h.to_json
#=> "{\"a\":123,\"b\":456}"       # note the escaped double quotes

puts h.to_json
# {"a":123,"b":456}               # when printed, quotes are no longer escaped

double_quote_1 = '"'              # another way to store " in a string
double_quote_2 = "\""
double_quote_1 == double_quote_2  # both have the same contents, a single "
#=> true

json1 = '{"a":123,"b":456}'       # less confusing way of writing the json from above
json2 = "{\"a\":123,\"b\":456}"
json1 == json2
#=> true
于 2013-09-19T20:39:18.320 に答える