0

错误信息是这样的

WebMock::Response::InvalidBody: 必须是以下之一:[Proc, IO, Pathname, String, Array]。'哈希'给出

我正在使用下面的代码来测试谷歌库以在我的控制器中获取用户信息

stub_request(:get, "https://www.googleapis.com/userinfo/v2/me")
      .to_return(
        body: {email: "test@test.con", 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>

服务是谷歌的授权,然后请求我可以使用 response.email 和 response.name 访问的用户数据。

但是,由于 google gem 获取信息并从中创建哈希,因此我无法对字符串执行任何 JSON.parse 等操作。

这样做的方法是什么?

测试套件:Rspec、capybara、webmock、VCR

4

2 回答 2

3

在 WebMock 中,不接受 Hash 作为响应正文。如果响应正文是 json,您需要将您的哈希编码为 json:

{ email: "test@test.con", name: "Petros" }.to_json
于 2019-03-19T11:17:38.317 回答
0

编辑:

跟进 Steel 的评论,如果您要使用存根方法,那么您将需要链接存根。你可以试试这个:

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: "test@test.con" ))

这使得正在发生的事情相当明确。

于 2017-02-01T21:54:25.413 回答