Django测试,“SQLCompiler”对象没有属性“col\u count”

2024-05-15 03:42:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在测试什么

我试图在我的models.py内对annotate_active查询集进行单元测试

class ServerQuerySet(QuerySet):

    def annotate_active(self, start=None, end=None):
        return self.annotate(
            active=Case(
                When(fqdn__in=self.get_active_fqdns(), then=True),
                default=False,
                output_field=BooleanField()
            )
        )


class Server(models.Model):
    ...
    objects = ServerQuerySet.as_manager()

工作原理

{cd3>返回

当我在django shell中执行查询时,一切正常:

^{pr2}$

测试失败

我在test_server.py中有以下测试用例(我希望这个测试在断言时失败)

from django.test import TestCase
from reports.models import Server


class TestServerQuerySet(TestCase):

    def test_annotate_active(self):
        result = Server.objects.annotate_active().values_list('fqdn', 'active')
        print(result)
        self.assertTrue(False)

但是,当我运行测试时:

python manage.py test reports.tests.test_server --settings=piesup2.settings.test

当它执行查询时,我得到一个AttributeError:

Creating test database for alias 'default'...
E
======================================================================
ERROR: test_annotate_active (reports.tests.test_server.TestServerQuerySet)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jwe/Documents/piesup2/reports/tests/test_server.py", line 9, in test_annotate_active
    print(result)
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 232, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 256, in __iter__
    self._fetch_all()
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 1087, in _fetch_all
    self._result_cache = list(self.iterator())
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/query.py", line 141, in __iter__
    for row in compiler.results_iter():
  File "/home/jwe/Documents/piesup2/venv/lib/python3.6/site-packages/django/db/models/sql/compiler.py", line 790, in results_iter
    fields = [s[0] for s in self.select[0:self.col_count]]
AttributeError: 'SQLCompiler' object has no attribute 'col_count'

----------------------------------------------------------------------
Ran 1 test in 0.010s

FAILED (errors=1)
Destroying test database for alias 'default'...

值得注意:

  • 其余的测试套件运行良好(大约140个测试使用DB读/写)
  • 示例shell输出使用与我的测试套件相同的settings/test.py文件。在

在我的环境中似乎存在某种冲突,在运行django的条件Case查询时,测试会中断。在

你知道怎么解决这个错误吗?在


Tags: djangoinpytestselfhomevenvmodels

热门问题