【问题标题】:What is the purpose of stubbing an HTTP request (e.g. using the WebMock gem)?存根 HTTP 请求的目的是什么(例如,使用 WebMock gem)?
【发布时间】:2014-10-08 14:14:51
【问题描述】:

作为前身仅供参考,我是一名崭露头角的开发人员。我正在尝试为 Ruby gem 的 http POST 方法编写测试。据我所知,当您存根 http 响应时,例如使用 Ruby WebMock gem,您基本上是在告诉它要发布什么,然后人为地告诉它要响应什么。例如,这是我要测试的代码:

## githubrepo.rb

module Githubrepo

include HTTParty

def self.create(attributes)

  post = HTTParty.post(
      'https://api.github.com/user/repos',

      :headers => {
        'User-Agent' => 'Githubrepo',
        'Content-Type' => 'application/json',
        'Accept' => 'application/json'
      },

      :basic_auth => {
          :username => attributes[:username],
          :password => attributes[:password]
      },

      :body => {
          'name' => attributes[:repository],
          'description' => attributes[:description]
      }.to_json
  )

Githubrepo.parse_response_from(post, attributes[:wants_ssh])

end

我写的时候我的 RSpec 测试失败了:

Githubrepo.create(:repository => 'test', :username => 'test_user', :password => '1234')

因为它发出了一个真正的 HTTP 请求。它建议我改为执行以下操作:

        stub_request(:post, "https://test_user:test_password@api.github.com/user/repos").
                with(:body => "{\"name\":\"test_repo\",\"description\":null}",
                     :headers => {'Accept'=>'application/json', 'Content-Type'=>'application/json', 'User-Agent'=>'Githubrepo'}).
           to_return(:status => 200, :body => "", :headers => {})

但对我来说,这似乎毫无意义,因为它基本上是在告诉发送什么以及响应什么。我可以编辑 URL 说 "https://bananas@git-banana.banana"headerContent-type => 'Rumplestilskin' 和 RSpec 是好的。我应该如何将其集成到测试我上面指定的create 方法的功能中?或者,如果有的话,有人可以指点我一个可靠的初学者指南或博客来帮助我解决这个问题吗? Ruby gem README 似乎假设用户已经知道一两件事,而我不知道。

【问题讨论】:

  • 重点不是测试 gihub 的 api 是否有效,重点是确保您的 create 方法正确处理响应。
  • 啊,谢谢。如果您打算测试如何解析响应,您如何测试以确保您正确调用 API?由于响应是人为生成的,有没有办法查看您是否正确地进行了调用以生成正确的响应?

标签: ruby api gem stub webmock


【解决方案1】:

正如史蒂夫在评论中提到的,这种测试的重点不是测试外部 API,而是您处理和解析响应的代码是正确的。

正如该问题的 cmets 中所讨论的,请查看 VCR gem 以“记录”API 响应,以确保您的代码正确处理它们:https://github.com/vcr/vcr

【讨论】:

  • 啊,谢谢。如果您打算测试如何解析响应,您如何测试以确保您正确调用 API?由于响应是人为生成的,有没有办法查看您是否正确地进行了调用以生成正确的响应?
  • 我现在在移动,但请看一下 VCR gem。您可以“记录”响应并对其进行解析,而不是在有意义的情况下提供响应。
  • 好的,我去看看。非常感谢。
  • 你当然可以做一个测试来确认对 API 的调用是正确的,但是你不想在你的所有测试中重复那个调用......这在资源和时间上是昂贵的。加 1 表示 @Skram 建议使用 VCR,它让呼叫通过一次,然后通过记住响应并重放它来自动取消未来的呼叫。这是一个伟大的宝石。github.com/vcr/vcr
猜你喜欢
  • 2015-04-29
  • 2013-02-28
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多