__init__.py下的 Python 补丁对象



我正在编写一个测试,我想模拟一个位于__init__.py的列表,这意味着不在类下。对象引用为: project/app/management/commands/__init__.py

__init__.py看起来像这样:

my_list_of_dict = [
{
    'name': 'option1',
    'vesion': 0,
},
{
    'name': 'option1',
    'vesion': 0,
}
]

如果是在一个类下,我会做这样的事情——

@mock.patch.object(Class, 'my_list_of_dict')

但事实并非如此。

我尝试了类似的东西

@mock.patch('project.app.management.commands.my_list_of_dict')
def test(self, mock_list):
    mock_list.return_value = [{.....}]

但它没有用。

编辑:

添加有关测试的信息

这是测试:

@mock.patch('project.app.management.commands.my_list_of_dict')
def test_run_command_with_parameters(self, mock_list_of_dict):
    mock_list_of_dict.return_value = [
                                        {
                                            'name': 'other_name',
                                            'vesion': 1
                                        }
    ]
    with mock.patch('django.core.management.call_command', return_value=True,
                    side_effect=None) as call_command_mock:
        c = Command()
        c.handle()

这是命令的一部分:

from . import my_list_of_dict
class Command(BaseCommand):
    def handle(self, *args, **options):
        for dict in my_list_of_dict:
        .....

现在,当测试到达handle()部分时 - 它获得原始值,而不是模拟值

只需提供commands模块的正确路径即可。

编辑(第一个例子是错误的,对不起):

假设测试在 project 内,在 tests 文件夹中,也许在some_tests.py中(project文件夹和每个子文件夹内部都有一个__init__.py)。此外,您还可以使用 project 文件夹中的python -m discover调用测试。

from unittest import mock
from unittest import TestCase
import app.management.commands # only needed for 2nd assert
class TestCase1(TestCase):
    @mock.patch('app.management.commands.my_list_of_dict')
    def test(self, mock_list):
        mock_list.return_value = [None]
        self.assertEqual(mock_list(), [None])
        self.assertEqual(app.management.commands.my_list_of_dict(),
                         [None])

现在在这里工作。补丁需要正确的路径,其中包含类或模块名称,后跟要修补的属性。

最新更新