Pytest django родовое отношение старый объект появился - PullRequest
0 голосов
/ 09 октября 2018

У меня есть модель:

class Product(models.Model):
    url = models.TextField(blank=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class Store(models.Model):
    product = GenericRelation('Product')

И задача сельдерея, которая создает продукт для магазина:

def my_celery_task(store_obj_pk):
    store_obj = Store.objects.get(pk=store_obj_pk)
    Product.objects.create(
                      content_type=ContentType.objects.get_for_model(store_obj),
                        object_id=store_obj.pk,
                    )

И я хочу протестировать эту задачу с pytest

class TestStoreTask:

    def test_store_one(self):
        self.__test_store(store_product={
            'name': 'one'
        })

    def test_store_two(self):
        self.__test_store(store_product={
            'name': 'two'
        })

    def __test_store(self, store_product):

        store_obj = Store.objects.create()
        my_celery_task(store_obj_pk=store_obj.pk)
        print(store_obj.product.all())

Итак, я ожидаю один объект для каждого теста.Но когда я запускаю оба теста в test_store_two, у меня есть два объекта.И эти объекты имеют идентификаторы 2 и 3.

Так что мой вывод для test_store_one:

<QuerySet [<Product: Product object (1)>]>

И для test_store_two:

<QuerySet [<Product: Product object (2)>, <Product: Product object (3)>]>

Я неНе понятно, почему идентификатор был изменен и почему объект появился в новом тестовом примере.

1 Ответ

0 голосов
/ 18 октября 2018

@ хулиганье спасибо за помощь.Это было очень странное поведение.Таким образом, создание объекта в задаче было методом другого класса, например:

    class SomeManagerClass:
        products = []

        def generate_products(self):
            self.products.append('one')

        def create_products(self, store_obj):
             for title in self.products:
                 Product.objects.create(
                      title=title,
                      content_type=ContentType.objects.get_for_model(store_obj),
                      object_id=store_obj.pk,
                    )

И в задаче я использовал его следующим образом:

def my_celery_task(store_obj_pk):
    store_obj = Store.objects.get(pk=store_obj_pk)
    manager = SomeManagerClass()
    manager.generate_products()
    manager.create_products(store_obj)

И когда я дважды вызываю my_celery_task,тогда я получаю 3 объекта вместо двух.Поскольку self.products предыдущий результат сохраняется.

Я решил эту проблему, изменив мою generate_products функцию, например:

def generate_products(self):
    self.products = []
    self.products.append('one')
...