用__init__.py模拟补丁

pra*_*ksh 6 python unit-testing mocking

我的代码组织如下:

DIR/A.py:

from X import Y

class A:
    ...
Run Code Online (Sandbox Code Playgroud)

DIR/__ init__.py:

from .A import A
__all__ = ['A']
Run Code Online (Sandbox Code Playgroud)

测试/ test_A.py:

class test_A:
    @patch("dir.A.Y")
    def test(self, mock_Y):
        ....
Run Code Online (Sandbox Code Playgroud)

在运行tests/test_A.py时,我(如预期的那样)得到错误:

AttributeError: <class 'dir.A.A'> does not have the attribute 'Y'
Run Code Online (Sandbox Code Playgroud)

问题是@patch("dir.A.y")试图Y在课堂上找到dir.A.A,而不是在模块中dir.A(实际存在的位置).

这显然是因为我的__init__.py.我可以通过将module-name A和class-name A更改为不同的符号来解决这个问题.

代码的组织方式,我想避免这样的命名更改.如何以正确位置patch找到的方式使用Y

Sve*_*ach 8

您可以patch.object()改为使用装饰器,并从sys.modules以下位置检索模块:

@patch.object(sys.modules['dir.A'], 'Y')
def test(self, mock_Y):
    ...
Run Code Online (Sandbox Code Playgroud)