<p>您可以轻松地启动服务器,然后在测试用例中访问它。gevent的<a href="http://bitbucket.org/denis/gevent/src/tip/greentest/" rel="noreferrer">own test suite</a>正是为了测试gevent的<a href="http://gevent.org/servers.html" rel="noreferrer">built-in servers</a>。</p>
<p>例如:</p>
<pre><code>class SimpleServer(gevent.server.StreamServer):
def handle(self, socket, address):
socket.sendall('hello and goodbye!')
class Test(unittest.TestCase):
def test(self):
server = SimpleServer(('127.0.0.1', 0))
server.start()
client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
response = client.makefile().read()
assert response == 'hello and goodbye!'
server.stop()
</code></pre>
<p>使用<code>0</code>作为端口值意味着服务器将使用任何可用的端口。启动服务器后,<code>bind</code>选择的实际值可用作<code>server_port</code>属性。</p>
<p><code>StreamServer</code>也支持SSL,将<code>keyfile</code>和<code>certfile</code>参数传递给构造函数,它将在传递给处理程序之前用<code>SSLObject</code>包装每个套接字。</p>
<p>如果您不使用<code>StreamServer</code>,并且您的服务器基于<a href="http://gevent.org/intro.html#lightweight-pseudothreads" rel="noreferrer">Greenlet</a>,那么实际上<a href="http://gevent.org/gevent.html#gevent.spawn" rel="noreferrer">spawning</a>应该这样做。不要忘记在测试用例结束时<a href="http://gevent.org/gevent.html#gevent.Greenlet.kill" rel="noreferrer">kill</a>它。</p>
<p>在<a href="http://gevent.org/" rel="noreferrer">gevent</a>中启动服务器和生成greenlet是快速操作,比创建新线程或进程快得多,而且您可以轻松地为每个测试用例创建新服务器。只要你不再需要服务器就别忘了清理。</p>
<p>我相信不需要模拟任何gevent API,因为服务器和客户机可以在同一个进程中愉快地生活,所以使用它要容易得多。</p>