4

作为前身仅供参考,我是一个崭露头角的开发人员。我正在尝试为 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 to say"https://bananas@git-banana.banana"headerto sayContent-type => 'Rumplestilskin'并且 RSpec 可以。我应该如何将其集成到测试create我上面指定的方法的功能中?或者,如果有的话,有人可以指点我一个可靠的初学者指南或博客来帮助我解决这个问题吗?Ruby gem READMEs 似乎假设用户已经知道一两件事,而我不知道。

4

1 回答 1

2

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

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

于 2014-08-14T20:02:34.323 回答