存根HTTP请求的目的是什么(例如使用WebMock gem)?

时间:2014-08-14 19:42:38

标签: ruby api gem stub webmock

作为一个前身FYI,我是一个崭露头角的开发者。我正在尝试为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 => {})

但对我而言,这似乎毫无意义,因为它基本上讲述了要发送什么以及回应什么。我可以修改网址以说出"https://bananas@git-banana.banana"header可以说Content-type => 'Rumplestilskin',RSpec也可以。我应该如何将其集成到测试上面指定的create方法的功能中?或者,如果有的话,有人可以指向一个可靠的初学者指南或博客来帮助我解决这个问题吗? Ruby gem README似乎假设用户已经知道了一两件事,我不知道。

1 个答案:

答案 0 :(得分:2)

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

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