嘲笑doctests

时间:2017-07-17 13:54:00

标签: python mocking doctest

我正在编写一个调用网络的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时加载它们会很好。

0 个答案:

没有答案