2015-05-04 4 views
2

У меня нет большого опыта работы с stubbing, и у меня возникают проблемы с запросами на Braintree с использованием webmock и braintree-rails.Webmock: как подделать gzip-ответ?

спецификации/spec_helper.rb

RSpec.configure do |config| 
    config.include(ConnectionHelper) 

    config.before(:each) do 
    stub_request(:post, /.*braintree.*/). 
    with(braintree_hash).to_return(gzipped_response) 
    end 
end 

спецификации/поддержка/connection_helper.rb

def gzipped_response 
    { 
    status: 200, 
    body: "\u001F\x8B\b\0:\x87GU\0\u0003\u0003\0\0\0\0\0\0\0\0\0", 
    headers: {} 
    } 
end 

def braintree_hash 
    { :body => /.*/, 
    :headers => {'Accept'=>'application/xml', 'Content-Type'=>'application/xml', 
    'User-Agent'=>'Braintree Ruby Gem 2.42.0 (braintree-rails-1.4.0)', 
    'X-Apiversion'=>'4'} 
    } 
end 

Rspec ошибка:

2) Content: when ordering content show page has relevant information 
    Failure/Error: click_button "Order" 
    Braintree::UnexpectedError: 
     expected a gzipped response 
    # ./app/classes/payment.rb:13:in `generate_token' 
    # ./app/controllers/posts_controller.rb:44:in `pay' 
    # ./spec/features/content_spec.rb:251:in `block (4 levels) in <top (required)>' 

Я пытаюсь проверить страницу, не сами платежи, однако при рендеринге страницы нужно сначала извлечь токен, и поэтому я получаю эту ошибку.

Как я могу придумать фальсификацию ответа gzip или, наоборот, пропустить все, что связано с запросами Braintree в моих тестах?

приложение/контроллеры/posts_controller.rb

def pay 
    @post = Post.find(params[:id]) 
    @client_token = Payment.new(current_user).generate_token 
end 

приложение/классы/payment.rb

class Payment  
    def initialize(customer) 
    @customer = customer 
    @customer_id = @customer.id 
    end 

    def generate_token 
    Braintree::ClientToken.generate(customer_id: @customer_id) 
    end 
end 
+0

Не мог бы вы добавить 'PostsController # pay'? – max

+0

@papirtiger Я добавил код для 'controller', но есть и другие методы' Payment', которые я буду использовать здесь и там, например 'create_customer' и' customer_subscription', которые, вероятно, будут вызывать ту же ошибку из-за 'gzipped response '. –

ответ

2

Я работаю в Braintree. Если у вас есть какие-либо вопросы о наших API и клиентских библиотеках, вы всегда можете указать reach out to our support team.

Ваш защищенный корпус отклика должен быть gzipped. Вы можете создать пустую сжатую строку, как это:

irb(main):010:0> require 'stringio' 
=> false 
irb(main):011:0> require 'zlib' 
=> false 
irb(main):012:0> Zlib::GzipWriter.new(StringIO.new("w")).close.string 
=> "\u001F\x8B\b\0:\x87GU\0\u0003\u0003\0\0\0\0\0\0\0\0\0" 

Так попробовать это для вашего метода status_ok:

def status_ok 
    { 
    status: 200, 
    body: "\u001F\x8B\b\0:\x87GU\0\u0003\u0003\0\0\0\0\0\0\0\0\0", 
    headers: {"Content-Encoding" => "gzip"} 
    } 
end 
+0

спасибо за ваш ответ, я пробовал с кодом выше, но все равно получаю ту же ошибку, обновляя свой вопрос сейчас. –

+0

@ mind.blank Моя ошибка. Я обновил свой ответ; вам также необходимо установить заголовок кодировки содержимого. – agf

+0

@ mind.blank Если вы хотите пропустить создание токена клиента для своих спецификаций контроллера, почему бы не заучить 'Braintree :: ClientToken.generate'? – agf