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
?
您可以patch.object()
改为使用装饰器,并从sys.modules
以下位置检索模块:
@patch.object(sys.modules['dir.A'], 'Y')
def test(self, mock_Y):
...
Run Code Online (Sandbox Code Playgroud)