2010-08-14 40 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