pytest Django通用关系旧对象出现

时间:2018-10-08 22:23:31

标签: python django celery pytest

我有一个模特:

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中运行两个测试时,我有两个对象。这个对象的ID为2和3。

所以我对test_store_one的输出:

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

对于test_store_two

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

我不明白为什么更改了id以及​​为什么对象出现在新的测试用例中。

1 个答案:

答案 0 :(得分:0)

@hoefling感谢您的帮助。这是非常奇怪的行为。因此,在任务中创建对象是另一个类的方法,例如:

    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')