Понимание Python Mock Framework - PullRequest
0 голосов
/ 05 мая 2018

Мне не удалось найти хорошее объяснение этого в сети, я предполагаю, что упустил что-то тривиальное, но я не смог найти это, поэтому я пришел сюда, чтобы спросить экспертов :)

У меня есть тест, где мне нужно пропатчить вызов конструктора, читая документы, как я понимаю, что-то вроде этого должно работать, но:

import unittest.mock as mocker
import some_module

mock_class1 = mocker.patch('some_module.some_class')
print(mock_class1 is some_module.some_class)  # Returns False
print(mock_class1) # <unittest.mock._patch>
mock_instance1 = mock_class1.return_value # _patch object has no attr return_value

Вместо этого я получаю другой вывод, если я делаю это

with mocker.patch('some_module.some_class') as mock_class2:
    print(mock_class2 is some_module.some_class)  # Returns True
    print(mock_class2) # <MagicMock name=...>
    mock_instance2 = mock_class2.return_value  # No problem
    print(mock_instance2) # <NonCallableMagicMock name=...>

Теперь для самого теста я использую модуль pytest-mock, который дает приспособление mocker, которое ведет себя как первый блок кода.

Я хотел бы знать:

  1. почему поведение отличается в зависимости от того, как человек называет фиктивные рамки

  2. есть ли чистый способ вызвать поведение второго блока кода без предложения with?

1 Ответ

0 голосов
/ 05 мая 2018

1) плагин pytest mocker разрабатывается, чтобы избежать использования контекстных менеджеров; и, вероятно, не всем нравится, как стандартная имитация играет с параметрами функций 2) не совсем. Он предназначен для использования в качестве менеджера контента или декоратора функций. Я думаю, что можно использовать пакет mocker без pytest

Ссылки https://github.com/pytest-dev/pytest-mock https://www.packtpub.com/mapt/book/application_development/9781847198846/5/ch05lvl1sec45/integrating-with-python-mocker

Как насчет установки pytest-mock и создания теста, подобного этому

import itertools

def test1(mocker):

    mock_class1 = mocker.patch('itertools.count')
    print(mock_class1 is itertools.count)
    print(mock_class1)
    mock_instance1 = mock_class1.return_value # Magic staff...

или может использовать monkeypatching ? Только не используйте стандартный unittest.mock с pytest

...