2010-08-14 56 views
2

python中的套接字模塊包裝了_socket模塊,它是C實現的東西。同樣,socket.socket將採用_sock參數,該參數必須實現_socket接口。在某些方面_sock必須是來自_socket的底層套接字類型的實際實例,因爲C代碼執行類型檢查(與純Python不同)。純python socket模塊

鑑於您可以傳入類似於套接字的對象_sock,您似乎可以編寫一個可以傳遞給socket.socket的套接字模擬器。它需要模擬底層套接字的行爲,但在內存中,而不是在真實的網絡或任何東西上。它不應與_socket區分開來。

需要什麼來建立這種模擬?

我知道,我知道,這不是非常實用。事實上,我學會了使用普通套接字比較簡單並且不需要假套接字的難題。我原以爲我會用假套接字更好地控制測試環境。無論我「浪費」了多少時間,我發現我在這個過程中學到了一些關於套接字和python的知識。

我猜測任何解決方案必須是相互作用的對象的這樣一個堆棧:

something_that_uses_sockets (like XMLRPCTransport for ServerProxy) 
    | 
    V 
socket.socket 
    | 
    V 
FakeSocket 
    | 
    V 
FakeNetwork 
    | 
    V 
FakeSocket ("remote") 
    | 
    V 
socket.socket 
    | 
    V 
something_else_that_uses_sockets (like SimpleXMLRPCServer) 

好像這基本上是怎麼回事真正的插槽,除了真正的網絡,而不是假一個(加上操作系統級別的插座),而不是FakeSocket的_socket

無論如何,只是爲了好玩,關於如何解決這個問題的任何想法?

順便說一句,有FakeSocket你可以做一些類似插座的東西,在谷歌應用程序...

回答

3

它已經完成。 Twisted廣泛用於協議實現的單元測試。一個好的起點將在some of Twisted's unit tests

從本質上講,您只需在您的協議上調用makeConnection就可以使用未連接到真實套接字的傳輸協議。超級簡單!

+0

太棒了!這正是我正在尋找的。也許我應該終於回頭看看扭曲。 :) – 2010-08-14 04:06:21