Почему я получаю это «нет неявного преобразования хэша в строку» при издевательстве над Stripe с помощью WebMock

#ruby #ruby-on-rails-4 #rspec #stripe-payments #webmock

#ruby #ruby-on-rails-4 #rspec #stripe-платежи #webmock

Вопрос:

Я пытаюсь издеваться над Stripe следующим образом:

 stub_request(:post, "https://api.stripe.com/v1/tokens").with(
 :body => {"card" => {"number" => "4242424242424242", "exp_month"=> "12", "exp_year" => "2018", "cvc" => "123"}}
).
to_return(:status => 200, :headers => {}, :body => {
  "id" => "tok_14CgP22eZvKYlo2CkgJ6ymLE",
  "livemode" => false,
  "created" => 1404517660,
  "used" => false,
  "object" => "token",
  "type" => "card",
  "card" => {
    "id" => "card_14CgP22eZvKYlo2CcdUNvicW",
    "object" => "card",
    "last4" => "4242",
    "brand" => "Visa",
    "funding" => "credit",
    "exp_month" => 12,
    "exp_year" => 2018,
    "fingerprint" => "Xt5EWLLDS7FJjR1c",
    "country" => "US"
  }
})
  

Я получаю no implicit conversion of Hash into String ошибку при вызове:

 token = Stripe::Token.create(:card => {
  :number => params["number"],
  :exp_month => params["expiry_month"],
  :exp_year => params["expiry_year"],
  :cvc => params["cvc"]})
  

Это из-за хэша в body в to_return , но я не знаю, как избежать ошибки.

Если я добавляю .to_s к хэшу, я получаю:

Недопустимый объект ответа из API: «{«id»=>»tok_14CgP22eZvKYlo2CkgJ6ymLE», «livemode»=> false, «created»=> 1404517660, «used»=> false, «object»=>»token», «type»=>»card», «card»=>{«id»=>»card_14CgP22eZvKYlo2CcdUNvicW», «object»=>»card», «last4″=>»4242″, » бренд»=>»Visa», «финансирование»=>»credit», «exp_month»=> 12, «exp_year»=> 2018, «отпечаток пальца» =>»Xt5EWLLDS7FJjR1c», «страна» => «US»}}» (код ответа HTTP был 200)

Если я добавляю .to_json в конец, Stripe::Token проходит, но я получаю stack error too deep ошибку, когда пытаюсь каким-либо образом использовать полученный token результат.

Что вы рекомендуете?

Комментарии:

1. Какой бит кода возвращается Invalid response object from API ? :body в stub_request должна быть строка. to_json звучит как правильная вещь, но какую ошибку это выдает?

2. Ошибка была от token = Stripe::Token.create(:card => { :number => params["number"], :exp_month => params["expiry_month"], :exp_year => params["expiry_year"], :cvc => params["cvc"]}) .

3. С помощью .to_json , Stripe::Token не выдал ошибку, но вызов результирующего token выдает.

Ответ №1:

Возможно, ваша заглушка возвращается некорректно. Это может помочь сделать вашу заглушку немного менее конкретной. Например:

 body = {
  "id" => "tok_14CgP22eZvKYlo2CkgJ6ymLE",
  "livemode" => false
  # snip...
}

stub_request(:post, "https://api.stripe.com/v1/tokens")
  .to_return(:status => 200, :body => body.to_json)
  

Однако трудно точно определить, какие ошибки выдаются, поэтому я могу дать только смутные идеи, которые могут помочь. Какую ошибку выдает вам вызов token ?

Комментарии:

1. К сожалению, это выдает stack error too deep ошибку.

2. Даже при изменении на mocking? Можете ли вы обновить вопрос с остальной частью вашего кода?