2009-04-21 58 views
11

我正在研究一個涉及到Web服務的應用程序。我想開發一個代理類,它返回來自服務的假響應,所以在開發/測試應用程序的其他部分時,我不必一直要求使用請求。在Ruby中生成HTTP響應

我的應用程序期待通過Net :: HTTP生成的響應。

response = Net::HTTP.get(URI.parse('http://foo.com')) 

case response 
when Net::HTTPOK 
    # do something fun 

when Net::HTTPUnauthorized 
    # you get the idea 

我該如何製造一個響應對象,給它所有正確的標題,返回一個正文字符串等?

response = ProxyClass.response_object 

case response 
when Net::HTTPOk 
    # my app doesn't know it's being lied to 

謝謝。

回答

8

我會從FakeWeb開始,看看是否符合您的需求。如果不行,你可以直接從內部提取任何你需要的東西並創建你自己的解決方案。

2

我會看看像mocha這樣的嘲弄圖書館。

那麼你應該能夠建立一個模擬對象,以幫助測試:

def setup 
@http_mock = mock('Net::HTTPResponse') 
@http_mock .stubs(:code => '200', :message => "OK", :content_type => "text/html", :body => '<title>Test</title><body>Body of the page</body>') 
end 

一個更完整的教程,在這裏我鉤住這個例子見Tim Stephenson's RaddOnline blog

0

我要麼使用上面提到的FakeWeb,要麼讓我的耙測試任務啓動一個Webrick實例到一個小的Sinatra應用程序,它嘲笑你希望看到的各種測試響應。

1

爲了測試Web服務客戶端,我們使用了Sinatra,這是一個可愛的小輕量級Web框架,可以讓您快速輕鬆地啓動並運行某些內容。查看主頁;它有5行代碼中的完整Hello World應用程序,以及兩個安裝和運行整個事件的命令。

0

你可以看看使用Rack這個應該讓你做你需要的一切。

15

實際上並不難,用Net :: HTTP直接推出自己的假響應。這裏有一個簡單的200 OK了餅乾頭:

def fake_response 
    net_http_resp = Net::HTTPResponse.new(1.0, 200, "OK") 
    net_http_resp.add_field 'Set-Cookie', 'Monster' 
    RestClient::Response.create("Body goes here", net_http_resp, nil) 
end 

由於我們幾個正在使用原始的Net :: HTTP了,(可選的)最後一行包裝起來作爲一個RestClient::Response,然後可以存根到RESTClient實現:

stub(RestClient).post(anything) { fake_response } 
+0

謝謝,有時人們依賴於奇怪的庫,即使http應該是如此簡單。很高興知道紅寶石已經建立了生成最低的http響應。 – Alan 2013-11-20 18:54:54

5

我知道這個職位是舊的,但不是FakeWeb這似乎在很大程度上是死的,嘗試webmock。它似乎更全面和非常活躍。