为什么mock.patch适用于已导入的对象的属性

问题描述 投票:0回答:1

我知道模拟路径的重要性,如图所示这里,但请考虑这个 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
仍然得到修补?

python python-mock
1个回答
0
投票

这是因为模拟修补了

Proxmox
的类命名空间,即在
Proxmox.__dict__
中,并且仍然在该命名空间中查找属性。

它之所以有效,是因为无论类型

Proxmox
从何处导入,访问
Proxmox.api
始终是
Proxmox
类上的属性访问。所有模块命名空间都会看到相同的补丁,因为它们都指向同一个类实例。

© www.soinside.com 2019 - 2024. All rights reserved.