Я создаю тест с помощью unittest.mock.patch, который выглядит примерно так:
class TestService:
def test_patched(self):
service = Service()
with patch.object(service, "_send_to_third_party") as patch_send:
with patch.object(service, "_notify_listeners") as patch_notify:
service.do_something()
patch_send.assert_called_once()
patch_notify.assert_called_once()
Все это работает нормально, но я бы хотел поместить эти исправления в метод, чтобы можно было повторно использовать его в нескольких тестах. Вот так:
class TestService:
def _patched_service(self):
service = Service()
with patch.object(service, "_send_to_third_party") as patch_send:
with patch.object(service, "_notify_listeners") as patch_notify:
return service, patch_send, patch_notify
def test_patched(self):
service, patch_send, patch_notify = self._patched_service()
service.do_something()
patch_send.assert_called_once()
patch_notify.assert_called_once()
Это не удается, поскольку вызывается настоящий метод, а не исправленный.
Для упрощения в следующем тесте третий вариант терпит неудачу, и я пытаюсь понять, почему и есть ли хороший способ сделать то, что я хочу?
from unittest.mock import patch
class ExampleClass:
def __init__(self):
self.value = 0
def add(self, value):
self.value += self._add(value)
def subtract(self, value):
self.value -= self._subtract(value)
def what_is_my_value(self):
return self.value
def _add(self, value):
return value
def _subtract(self, value):
return value
def patch_me(exa: ExampleClass):
with patch.object(exa, '_add', return_value=99):
with patch.object(exa, '_subtract', return_value=66):
return exa
class TestPatchingWorks:
def test_unpatched_works(self):
exa = ExampleClass()
exa.add(5)
exa.subtract(2)
assert exa.what_is_my_value() == 3
def test_patching_works_with_patch_class(self):
exa = ExampleClass()
with patch.object(ExampleClass, '_add', return_value=30):
with patch.object(ExampleClass, '_subtract', return_value=10):
assert exa.what_is_my_value() == 0
exa.add(5)
assert exa.what_is_my_value() == 30
exa.subtract(2)
assert exa.what_is_my_value() == 20
def test_patching_works_with_patch_instance(self):
exa = ExampleClass()
with patch.object(exa, '_add', return_value=40):
with patch.object(exa, '_subtract', return_value=30):
assert exa.what_is_my_value() == 0
exa.add(5)
assert exa.what_is_my_value() == 40
exa.subtract(2)
assert exa.what_is_my_value() == 10
def test_patching_works_with_function(self):
exa = ExampleClass()
exa = patch_me(exa)
assert exa.what_is_my_value() == 0
exa.add(5)
assert exa.what_is_my_value() == 99
exa.subtract(2)
assert exa.what_is_my_value() == 33
Подробнее здесь: https://stackoverflow.com/questions/787 ... o-instance
Исправление во вспомогательной функции не применяется к экземпляру ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Почему цикл for выполняется быстрее, когда он выполняется внутри вспомогательной функции?
Anonymous » » в форуме JAVA - 0 Ответы
- 33 Просмотры
-
Последнее сообщение Anonymous
-