объект исправления Python, который находится под __init__.py - PullRequest
0 голосов
/ 31 января 2019

Я пишу тест и хочу смоделировать список, который находится в __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() часть - получает исходное значение, а не смоделированное

1 Ответ

0 голосов
/ 01 февраля 2019

Просто укажите правильный путь к вашему commands модулю.

Редактируйте (первый пример был неверен, извините):

Предположим, что тесты находятся внутри project, в testsпапка, может быть в some_tests.pyproject папка и каждая подпапка имеет __init__.py внутри).Также вы вызываете тесты, например, с python -m discover из папки project.

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])

Это работает здесь и сейчас.Для исправления требуется правильный путь с именем класса или модуля, за которым следует атрибут для исправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...