首页 > 解决方案 > 如何使 citext 扩展在 Django 测试中工作?

问题描述

我正在针对具有ArrayField(CICharField())字段的模型运行测试,它们返回字符串而不是列表。我pytest-django用来运行测试。

我知道返回字符串而不是列表在过去是一个已知问题,但它已在我当前的 Django 版本(2.1.13)中修复。

当我从 shell 重现测试时,一切正常。事情似乎与测试环境有关,特别是测试套件如何创建数据库。据我了解,citext在测试期间未正确安装扩展程序。

如果我运行测试电池两次,保持数据库(使用--reuse-db),第二次(和下一次)运行良好。这让我认为扩展安装“为时已晚”。

可能不是很有用,但这是我得到的结果:

self = <tests.test_ciarrayfield.CIArrayFieldTestCase testMethod=test_save_load>

    def test_save_load(self):
        print(settings.INSTALLED_APPS)
        instance = ProductFactory(sku="SKU1", product_types=[])
        loaded = Product.objects.get()
>       self.assertEqual(instance.product_types, loaded.product_types)
E       AssertionError: [] != '{}'

src/tests/test_ciarrayfield.py:14: AssertionError

我的模型的一部分:

class Product(models.Model):
    product_types = ArrayField(
        CICharField(max_length=750),
        default=list, blank=True)

显而易见的预期结果是在从数据库中获取实例后获取该字段的列表,而不是字符串。正如我所说,这发生在我的 shell 上,但没有发生在测试上(除非我保留测试数据库并运行两次测试)。

标签: djangopostgresqlpytestpytest-django

解决方案


推荐阅读