関連
やること
以前やったメソッドの置き換えを使って、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