我知道模拟路径的重要性,如图所示这里,但请考虑这个 Django 场景
模型.py
class Proxmox(Model):
@property
def api(self, ...):
....
任务.py
def run_task(...):
....
views.py
from models import Proxmox
from tasks import run_task
class APIView(...):
def get(request):
Proxmox.objects.get(...).api.do_something()
run_task()
测试.py
class MyTestCase(...):
@mock.patch('tasks.run_task') <---- this is not patched as already imported in view
#@mock.patch('views.run_task'). <---- this patches fine
@mock.patch('models.Proxmox.api') <---- but why this works fine?
def test_one(self, mock_api, mock_run_task):
client.get(....)
...
Proxmox
和run_task
都导入到views.py
中,那么为什么修补models.Proxmox.api
仍然得到修补?
这是因为模拟修补了
Proxmox
的类命名空间,即在 Proxmox.__dict__
中,并且仍然在该命名空间中查找属性。
它之所以有效,是因为无论类型
Proxmox
从何处导入,访问 Proxmox.api
始终是 Proxmox
类上的属性访问。所有模块命名空间都会看到相同的补丁,因为它们都指向同一个类实例。