2017-02-01 2 views
0

Сообщение об ошибке этоWebmock и хэш вопросы

WebMock :: Response :: InvalidBody: должен быть один из: [Proc, IO, PathName, строка, массив]. «Hash» дал

Я использую этот код, чтобы проверить библиотеку Google для получения информации о пользователе в мой контроллер

stub_request(:get, "https://www.googleapis.com/userinfo/v2/me") 
     .to_return(
     body: {email: "[email protected]", name: "Petros"}, 
     headers: {"Content-Type"=> ["application/json","charset=UTF-8"]} 
    ) 

Это код контроллера

service = auth_with_oauth2_service(calendar_account.get_token) 
     response = service.get_userinfo_v2 

     calendar_account.user_id = current_user.id 
     calendar_account.email = response.email 
     calendar_account.name = response.name 

auth_with_oauth2_service содержит это

def auth_with_oauth2_service(access_token) 

    auth_client = AccessToken.new access_token 
    service = Google::Apis::Oauth2V2::Oauth2Service.new 
    service.client_options.application_name = "****" 

    service.authorization = auth_client 

    return service 
    end 

ответа форма содержания

#<Hurley::Response GET https://www.googleapis.com/userinfo/v2/me == 200 (377 bytes) 647ms> 
Success - #<Google::Apis::Oauth2V2::Userinfoplus:0x007ff38df5e820 
@email="****", 
@family_name="Kyriakou", 
@gender="male", 
@given_name="Petros", 
@id="", 
@link="***", 
@locale="en-GB", 
@name="Petros Kyriakou", 
@picture= 
    "***", 
@verified_email=true> 

служба является авторизацией с помощью Google, а затем запросить данные пользователя, которые я могу получить доступ с response.email и response.name.

Однако, поскольку gogle google получает информацию и создает хэш из нее, я не могу делать JSON.parse и т. Д. В строке.

Каким образом это можно сделать?

Набор тестов: Rspec, капибары, webmock, VCR

+1

Я бы рекомендовал издеваться над этим сервисом напрямую, а не издеваться над HTTP-вызовом по всему миру. Я думаю, вам будет легче. 'allow (my_service) .to receive (: my_method) .and_return (my_results)' – steel

+0

@steel спасибо за ваше сообщение, однако я не совсем уверен, как использовать это, я написал это, 'allow (service) .to receive (: get_userinfo_v2) .and_return (электронная почта: «[email protected]», имя: «petros») ', но я получаю неопределенную локальную переменную или метод« сервис », какой смысл имеет смысл? –

+1

Да, это будет больше похоже: 'allow (Google :: Apis :: Oauth2V2 :: Oauth2Service.new) .to получать (: get_userinfo_v2) .and_return (OpenStruct.new (имя:« Petros », электронная почта:« test @ test.con "))' –

ответ

0

EDIT:

Вслед за комментарий Стил, если вы собираетесь использовать метод заглушки, то вы будете нуждаться в цепи в окурки. Вы можете попробовать:

service = Object.new 
allow(Google::Apis::Oauth2V2::Oauth2Service).to receive(:new).and_return(service) 
allow(service).to receive(:get_userinfo_v2).and_return(OpenStruct.new(name: "Petros", email: "[email protected]")) 

Это делает то, что происходит довольно четко.

+0

hey '.to_json' очистил ошибку, но теперь я получаю' undefined method 'email' для nil: NilClass', я полагаю, что это имеет какое-то отношение к сервису , нужно также урезать? я добавил больше кода, пожалуйста, см. 'auth_with_oauth2_service' –

+0

Да, я думаю, в вашем контроллере' response' теперь равен нулю, и он вызывает '.email' на нем. Hmmmmm. Я буду продолжать думать об этом. –

+0

Можете ли вы зарегистрировать объект 'response' при успешном вызове и опубликовать, что этот объект находится в вопросе? Благодаря! –

Смежные вопросы