我正在编写一个调用网络的Python库。在编写文档时,我想在表单中提供一个示例作为doctest:
class Endpoint:
"""RPC endpoint representation for a service.
>>> from ankhor import Endpoint
>>> e = Endpoint("_hello_service._tcp.example.com")
>>> e.say_hello(name="John Doe")
'hello, John Doe!'
>>>
"""
运行doctests时显然会失败,因为example.com
域不存在。我希望通过模拟Endpoint
类使用的解析器,以及在服务启动之前启动示例服务来进行此测试。
我显然可以使用这样的东西:
class Endpoint:
"""RPC endpoint representation for a service.
>>> from ankhor import Endpoint
>>> from wsgiref.simple_server import make_server
>>> import threading
>>>
>>> app = hello_world_service.create_app({})
>>> s = make_server('', TEST_PORT, app)
>>> threading.Thread(target=s.handle_request).start()
>>>
>>> e = Endpoint("_hello_service._tcp.example.com", MockedResolver())
>>> e.say_hello(name="John Doe")
'hello, John Doe!'
>>>
"""
但这极大地混淆了示例代码。
所以,最终的问题是:如何使第一段示例代码的清晰度与后者相同(这样可以模拟服务和发现)?
请注意,此问题与Using Mocks inside Doctests?不同,其中目标是使用模拟;这个问题的目标是保持示例可读,同时仍然可以运行。
Bonus:在第二个例子中,我必须将测试类放在主Python模块树中。如果只在运行doctests时加载它们会很好。