在嵌套函数上运行单元测试

2024-04-19 10:09:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自Java世界,在那里可以隐藏变量和函数,然后使用反射对它们运行单元测试。我使用嵌套函数来隐藏类的实现细节,以便只有公共API可见。我试图针对这些嵌套函数编写单元测试,以确保在开发时不会破坏它们。我尝试调用其中一个嵌套函数,如:

def outer():
    def inner():
        pass

outer.inner()

这将导致错误消息:

AttributeError: 'function' object has no attribute 'inner'

有没有办法针对这些嵌套函数编写单元测试?如果没有,是否有方法触发函数名的名称munging,就像在类变量前面加上前缀一样?


Tags: 函数api消息objectdef错误世界function
3条回答

我认为没有机会从外部命名空间访问inner()。

然而,在我看来,保持inner()嵌套的事实意味着唯一真正重要的“契约”是outer()的契约。inner()是实现的一部分,您不应该希望测试实现。 如果您真的想测试inner(),可以使用包含inner()所有功能的数据对outer()进行广泛的测试。

Python惯例是用前导下划线命名“private”函数和方法。当你看到一个前导下划线,你知道不要尝试使用它。

记住,Python is not Java

内在的不存在,直到外在的创造。为了实现可测试性,您应该将inner移到顶层函数,或者让外部测试测试自身和内部所有可能的执行路径。

请注意,内部函数不是一个简单的函数,而是一个闭包。考虑这个案例:

def outer(a):
    b = compute_something_from(a)
    def inner():
        do_something_with(a, b)

这是标准的可测试性权衡。如果您的cyclomatic complexity太高,那么您的测试将太多。

相关问题 更多 >