【问题标题】:How to doctest functions with volatile output?如何使用 volatile 输出 doctest 函数?
【发布时间】:2018-03-13 20:35:45
【问题描述】:

运行 doctest 时,volatile 输出不同,因此测试失败。理想情况下(但不一定),解决方案应尽量避免在文档字符串之外编写可测试代码,以免影响测试覆盖率。

from datetime import datetime
def get_now():
    """
    >>> get_now()
    datetime.datetime(2018, 3, 13, 20, 26, 44, 258862)
    """
    return datetime.now()

【问题讨论】:

    标签: python unit-testing docstring doctest


    【解决方案1】:

    您想要断言效果已发生,因此您应该修补 datetime 并断言 now 已被调用。

    这是未经测试的,可能不起作用,但应该说明这个想法:

    from datetime import datetime
    def get_now():
        """
        >>> from unittest import mock
        >>> my_module.datetime.now = lambda: datetime(2018, ...)
        >>> get_now()
        datetime.datetime(2018, ...)
        """
        return datetime.now()
    

    【讨论】:

    • 我明白了。但是,最终用户在调用?get_now 时也会看到与模拟相关的代码。是否可以避免这种行为?
    • 我不认为你可以通过关于不在文档字符串之外添加代码的额外限制来避免它。您还可以将其重构为以随机源为参数的确定性函数。 def get_now(now): return now()
    • 在这种情况下,我可能更喜欢在文档字符串之外模拟文档测试。如果你知道答案,我很乐意接受。
    • 我不知道解决方案,但我怀疑您需要扩展 doctest 运行器来处理您需要的模拟。
    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多