我正在编写一个测试,我想模拟一个位于__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])
现在在这里工作。补丁需要正确的路径,其中包含类或模块名称,后跟要修补的属性。