【发布时间】:2020-06-23 02:06:44
【问题描述】:
我有一个具有这种结构的目录:
├── aaa.py
├── src
│ └── subsrc
│ ├── else.py
│ └── util.py (there is a "foo" function")
└── tests
├── __init__.py
└── unittests
├── __init__.py
└── test_aaa.py
所以“aaa.py”、“tests”目录和“src”目录都在项目根目录中。在“test_aaa.py”中,我使用mock来模拟“util.py”中的函数:
from src.subsrc.util import foo
import pytest
from unittest import mock
@mock.patch("src.subsrc.util.foo")
def test_foo(mock):
mock.return_value = 111
然后我在“unittests”目录中运行python3.7 -m pytest,它起作用了。这对我来说很有意义,因为 pytest 会找到第一个没有 __init__.py 的目录,然后将其添加到 PATH(在这种情况下,将添加项目根目录)以便它可以找到“src.subsrc.util.foo”。
但后来我对“test_aaa.py”做了一个小改动,在它的“mock.patch”中,我在开头添加了“aaa”:
from src.subsrc.util import foo
import pytest
from unittest import mock
@mock.patch("aaa.src.subsrc.util.foo")
def test_foo(mock):
mock.return_value = 111
它仍然有效,“aaa.py”是一个可执行文件,在“aaa.py”中:
#!python3.7
from src.subsrc.else import other
if __name__ = "__main__":
# ...
pass
我很困惑为什么@mock.patch("aaa.src.subsrc.util.foo") 也有效,Python 是否如此聪明以至于它可以忽略“aaa”然后去“src.subsrc..”去寻找它需要的东西?谢谢!
更新: 我怀疑是不是因为“aaa.py”的名字很特别,所以我把它改成了不同的名字,但它仍然有效。就像我将其更改为“bbb.py”,然后在 mock.patch 中,“aaa.src ...”不起作用但“bbb.src ...”仍然有效。所以我确信“mock.patch”会首先找到这个可执行文件。
更新: 我猜这可能与“mock.patch()”的工作原理有关?
【问题讨论】:
标签: python mocking pytest python-3.7 python-unittest