Исправление во вспомогательной функции не применяется к экземпляруPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Исправление во вспомогательной функции не применяется к экземпляру

Сообщение Anonymous »

Я создаю тест с помощью 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»