LoginSignup
2
4

More than 5 years have passed since last update.

Net::HTTPの特定のリクエストをmockしてみる

Last updated at Posted at 2015-01-13

関連

やること

以前やったメソッドの置き換えを使って、Net::HTTPの特定のリクエストをmockしてみる。
今回はyahooのトップページへのGETアクセスをmockに置き換えてみる。

Net::HTTP#getは内部でrequestメソッドをブロック付き読んでいる。
ブロックはtransport_request内で呼ばれる。
普通に置き換えるだけだとレスポンスのread_bodyでエラーになってしまうので、これも偽者を返すようにしてやる。

やってみた

netmock.rb
require 'net/http'

module Mock
  extend self

  def on
    ::Net::HTTP.class_eval do
      alias_method :__request, :request; remove_method :request
      include ::Mock::Net::HTTP
    end 
  end 

  module Net 
    module HTTP
      def request(req, body = nil, &block)
        if yahoo_top?(req)
          yield HTTPResponse.new(nil, "200", "OK")
        else
          __request(req, body, &block)
        end 
      end 

      private

      def yahoo_top?(req)
        !!(req.method == "GET" && self.address == "www.yahoo.co.jp" && req.path == "/")
      end 
    end 

    class HTTPResponse < ::Net::HTTPResponse
      def read_body(dest = nil, &block)
        "OK"
      end 
    end 
  end 
end

Mock.on
res_g = Net::HTTP.new("www.google.co.jp", 80).get("/")  # googleの場合
res_y = Net::HTTP.new("www.yahoo.co.jp",  80).get("/")  # yahooの場合

p res1.class  #=> Net::HTTPOK
p res2.class  #=> Mock::Net::HTTPResponse

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4