менеджер контекста патча pytest-mock не восстанавливает объект при выходе - PullRequest
1 голос
/ 09 октября 2019

Мы недавно перешли с юнит-теста на pytest. Я столкнулся со странной проблемой при использовании mocker.patch в качестве менеджера контекста. Рассмотрим следующий пример.

module_a.py

class MyClass:
    def value(self):
        return 10

module_b.py

import module_a
class AnotherClass:
    def get_value(self):
        return module_a.MyClass().value()

test_module_b.py

from module_b import AnotherClass
def test_main_2(mocker):
    with mocker.patch('module_a.MyClass.value', return_value=20):
        value = AnotherClass().get_value()
        assert value == 20
    value = AnotherClass().get_value()
    assert value == 10

Я ожидаючто при выходе из диспетчера контекста метод метода значений MyClass будет восстановлен (возвращаемое значение 10), однако при втором утверждении assert проверка завершится неудачно с ошибкой утверждения 20 != 10 Если я использую тот же самый тест, но заменил mocker.patchс unittest.mock.patch это проходит. Я думал, что pytest-mock использует тот же API, что и unittest.mock, поэтому я не понимаю, почему есть разница.

1 Ответ

1 голос
/ 09 октября 2019

При pytest-mock разрыв выполняется при выходе из контекста прибора. Объект mocker.patch - это не просто псевдоним для mock.patch.

. При написании тестов в стиле pytest вам не нужны контекстные менеджеры в функциях теста, а фактически цельиз плагина pytest-mock сделать использование диспетчеров контекста и декораторов функций для насмешек ненужным .

Если по какой-то причине вам нужен шаг разрыва с в сам тест, а затем вам нужен простой старый mock API, который также отлично работает в pytest.

from unittest.mock import patch

def test_main_2():
    with patch('module_a.MyClass.value', return_value=20):
        value = AnotherClass().get_value()
        assert value == 20
    value = AnotherClass().get_value()
    assert value == 10

Помните, что эта вложенная структура действительно то, чего pytest намеревается избегать, чтобы сделать ваши тесты более читабельными,так что вы несколько упускаете из виду то, что не выполняете настройку и демонтаж полностью с приборами.

...