Сигналы Django: несоответствие дБ при тестировании - PullRequest
0 голосов
/ 28 сентября 2019

Совершенно так же, как Тестовый пример Django, дающий непоследовательные ответы, кеширование или виновник транзакции? , у меня непоследовательное поведение из базы данных во время юнит-тестов.

Точнее,тестовый класс с ошибками выглядит следующим образом:

  • во время настройки , запускается создание экземпляра сигнала модели
  • для этой модели и заполняется полев SQL (cursor.execute...)
  • в конце функции сигнала , я проверяю, что поле заполнено -> нет проблем, все работает отлично
  • следующая строка в настройке , я перезагружаю модель из базы данных и проверяю поле -> нет значения

Я действительно в растерянности, так что если у кого-то есть идеио том, что происходит, не стесняйтесь поделиться;)

РЕДАКТИРОВАТЬ: вот соответствующие части кода

# my_app/models.py

class MyModel(Model):
    name = CharField(max_length=50)
    search = SearchVectorField(blank=True, null=True)

# my_app/signals.py
@receiver(post_save, sender=MyModel)
def update_search(sender, instance, **kwargs):
    print("Search field before", MyModel.objects.get(pk=instance.id).search)
    with connection.cursor() as cursor:
        cursor.execute("""
            UPDATE myapp_mymodel AS mb
            SET search = to_tsvector('simple'::regconfig, mb.name)
            WHERE mb.id = {};
        """.format(instance.id))
        print("Search field", MyModel.objects.get(pk=instance.id).search)
        time.sleep(5)
        print("Search field later", MyModel.objects.get(pk=instance.id).search)

# my_app/tests.py
class MyModelTests(APITestCase):
    @classmmethod
    def setUpClass(cls):
        cls.item = MyModel.objects.create(name=FAKER.name(max_nb_chars=50))
        cls.item.refresh_from_db()
        print("Search field just after creation", MyModel.objects.get(pk=cls.item.id).search)

Я получаю следующий вывод:

Search field before None #alright
Search field 'adélaïde':1 'moreno':2 #update works
Search field later 'adélaïde':1 'moreno':2 #reloading slightly later, out of despair, still works
Search field just after creation None # reloading from the setUpClass method doesn't work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...