Протестируйте oauth2 get_token с помощью rspec

Я создаю спецификацию контроллера для части get_token аутентификации oauth2. На данный момент пользователь авторизовал мое приложение, и мне нужно сгенерировать и сохранить токен и другую информацию. Rspec терпит неудачу с несколько загадочной ошибкой.

Failure/Error: get :auth, { code: "auth_code", scope: "read_write" }
     OAuth2::Error:
       {:token_type=>"bearer", 
        :stripe_publishable_key=>"PUBLISHABLE_KEY", 
        :scope=>"read_write", 
        :livemode=>"false", 
        :stripe_user_id=>"USER_ID",  
        :refresh_token=>"REFRESH_TOKEN", 
        :access_token=>"ACCESS_TOKEN"}

Вот код контроллера. Rspec говорит, что он терпит неудачу на get_token.

require 'oauth2'

def auth
  code = params[:code]
  client = oauth_client
  token_response = client.auth_code.get_token(code, params: { scope: 'read_write' })
  token = token_response.token

И вот тест. Веб-макет должен перехватывать get_token. Это автоматически сгенерированный веб-макет, предложенный rspec, который я заполнил в теле соответствующим телом запроса и ответа.

before do
  stub_request(:post, "https://connect.stripe.com/oauth/token").
    with(:body => {"client_id"=>"CLIENT_ID",
                   "client_secret"=>"SOME_SECRET",
                   "code"=>"auth_code",
                   "grant_type"=>"authorization_code",
                   "params"=>{"scope"=>"read_write"}},
         :headers => {'Accept'=>'*/*',
                      'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
                      'Content-Type'=>'application/x-www-form-urlencoded',
                      'User-Agent'=>'Faraday v0.9.0'}).
    to_return(:status => 200,
              :body => {token_type: "bearer",
                        stripe_publishable_key: "PUBLISHABLE_KEY",
                        scope: "read_write",
                        livemode: "false",
                        stripe_user_id: "USER_ID",
                        refresh_token: "REFRESH_TOKEN",
                        access_token: "ACCESS_TOKEN"},
              :headers => {})
end

describe "#auth" do
  it "creates a payment gateway" do
    get :auth, { code: "auth_code", scope: "read_write" 
  end
end

Этот процесс уже работает на практике, так что, по крайней мере, код контроллера не виноват. Что я делаю неправильно?


person brodney    schedule 04.08.2014    source источник


Ответы (2)


После тяжелой работы с той же проблемой у меня есть решение. Если заголовок возвращается в запросе-заглушке, он остается пустым. Гем oauth2 использует Content-Type, чтобы определить, как анализировать тело. Попробуйте заглушку поместить заголовок таким образом:

stub_request(:post, "https://connect.stripe.com/oauth/token").
    with(:body => {"client_id"=>"CLIENT_ID",
                   "client_secret"=>"SOME_SECRET",
                   "code"=>"auth_code",
                   "grant_type"=>"authorization_code",
                   "params"=>{"scope"=>"read_write"}},
         :headers => {'Accept'=>'*/*',
                      'Accept-Encoding'=>'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
                      'Content-Type'=>'application/x-www-form-urlencoded',
                      'User-Agent'=>'Faraday v0.9.0'}).
    to_return(:status => 200,
              :body => {token_type: "bearer",
                        stripe_publishable_key: "PUBLISHABLE_KEY",
                        scope: "read_write",
                        livemode: "false",
                        stripe_user_id: "USER_ID",
                        refresh_token: "REFRESH_TOKEN",
                        access_token: "ACCESS_TOKEN"},
              :headers => { 'Content-Type'=> 'application/json;charset=UTF-8'})
person Amaury González Muro    schedule 26.10.2018

Я думаю, вы получаете эту ошибку, потому что вы заглушили только часть сеанса oauth, то есть вы пытаетесь отправить устаревший токен (или что-то в этом роде), который был предоставлен webmock.

Вместо ручной заглушки этих запросов я бы предложил использовать специальный инструмент: stripe-ruby-mock gem, который был разработан именно для тестирования Stripe API.

В качестве альтернативы вы можете использовать VCR gem (вот документы), который позволяет записывать на диск всю вашу http-сессию и воспроизводить ее в реальном времени. Отличный инструмент, рекомендую.

person Alexey Shein    schedule 21.09.2015