Django как предотвратить запуск исправленного метода при его создании в суперклассе
У меня есть модель с методом post-save, который я не хочу запускать в тесте:
class MyModel(models.Model):
def save(self, *args, **kwargs):
super(MyModel, self).save(*args, **kwargs)
self.post_save_method()
def post_save_method(self):
print("oh no!")
return "real value"
Если я делаю обычный тест, все работает так, как я ожидал. Я могу поставить патч на метод и увидеть, что я получаю подражаемое возвращаемое значение, и что post_save_method
не выполняется (ничего не выводится из этого метода в консоль):
from django.test import TestCase
from .models import MyModel
from unittest.mock import patch
class TestMakeObjectNormally(TestCase):
@patch.object(MyModel, 'post_save_method')
def test_something(self, post_save_mock):
post_save_mock.return_value = "mocked value"
my_model = MyModel.objects.create()
print(my_model.post_save_method())
Но способ настройки тестов таков, что экземпляр создается в суперклассе. Следуя этому гисту я попытался сделать патч на уровне класса:
class BaseTest(TestCase):
def setUp(self):
self.my_model = MyModel.objects.create()
@patch.object(MyModel, 'post_save_method')
class TestMakeObjectInSuper(BaseTest):
def setUp(self):
super().setUp()
def test_something(self, post_save_mock):
post_save_mock.return_value = "mocked value"
print(self.my_model.post_save_method())
Это работает в том смысле, что возвращаемое значение post_save_method
является насмешкой, но, к сожалению, я вижу, что метод запущен ("oh no!" выводится в консоль).
(я также пробовал исправлять оба метода setUp()
и базовый класс)
Любой совет приветствуется!