如何仅在选定的类方法中修补导入的函数?

时间:2019-04-01 11:35:45

标签: python unit-testing mocking python-unittest

我有一个具有两个方法的类。这两种方法都使用从另一个模块导入的请求函数。如何仅在这些类方法之一中修补请求功能?

我一直在寻找这样的话题,但没有找到任何相关的话题。

模块foo.py

from module import some_func

class A():
    def func_1():
        return some_func(x)
    def func_2():
        return some_func(y)

到目前为止我尝试过的是: 模块test.py

from foo import A

with patch('foo.some_func'):
    A().func_1()
    A().func_2()    

这将修补func_1和func_2中some_func的使用,对吗?

from foo import A

with patch('foo.A.func_1.some_func'):
    A().func_1()
    A().func_2()    

这会引发一个错误,即func_1不具有some_func属性(这是可以理解的)。

,我想仅在func_1中修补some_func的使用。

1 个答案:

答案 0 :(得分:3)

我认为不可能。修补通过替换整个模块中的符号而起作用-因此,当您替换some_func中的A时,将修补some_func的所有实例。

您可以通过两次导入some_func(使用两个不同的名称)来解决此问题

from foo import some_func
from foo import some_func as some_func_two

现在使用some_func中的func_1some_func_two中的func_2。现在,您可以在测试期间修补some_func,并且func_2仍应使用其他方法。尽管我建议不要这样做-更改实际代码以测试气味,就像您应该重构代码一样。