Django测试错误

时间:2016-05-23 01:09:50

标签: django unit-testing python-3.x django-unittest

我正在为我正在处理的应用程序编写单元测试。我的测试在我的2012 Macbook pro上运行正常但不是我的2015 iMac。两者都运行最新的OSX,django版本是1.9.1版本,可以在此处看到自定义修改:https://github.com/shuttl-io/django。修改模板加载机制的位置。

在我继续之前,我的测试是如此组织的:

app/
    tests/
        test_models/
           __init__.py
           test_*.py
        test_views/
            __init__.py
            test_*.py
        test_forms/
            test_*.py
            __init__.py

在这些__init__文件中,我包含了所有test_*.py个文件。

无论如何,在我的测试中,我在test_models的测试文件中有一些模拟类。我的2012 MbP似乎将使用模拟类将测试数据库迁移到测试数据库中。我的测试文件如下所示:http://pastebin.com/m9VKDLhE。然而,在我的iMac上,我的文件顶部的模拟类没有被迁移。所以我读了这个问题并决定添加一个写在某处的测试应用程序。测试具有相同的组织,并且模拟类移动到models.py。然后在我的settings.py文件中,我有这个片段:

if "test" in sys.argv:
    INSTALLED_APPS.append("testing")
    if "makemigrations" in sys.argv:
        ndx = sys.argv.index("test")
        sys.argv.pop(ndx)
        pass
    pass

基于此处发布的代码段:https://code.djangoproject.com/ticket/7835#trac-change-3-1226837305000000

现在这可以工作并将模拟文件放入数据库并摆脱OperationalError。然而,这增加了我不知道的更复杂的错误。

在我讨论错误之前,以下是导致错误的类: http://pastebin.com/n3906RC8。它继承的可发布类不是模型,只是一个抽象基类,需要实现一些方法。

现在我最初得到的错误就是这个错误:

======================================================================
ERROR: test_renderSite (testing.tests.test_webpage.test_models.test_webpage.WebsiteTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/Yoseph/shuttl/testing/tests/test_webpage/test_models/test_webpage.py", line 80, in test_renderSite
    siteMap = self.website.getSiteMap()
  File "/Users/Yoseph/shuttl/Webpage/models.py", line 155, in getSiteMap
    return self.root.render()
  File "/Users/Yoseph/shuttl/Webpage/models.py", line 252, in render
    for i in self.children:
  File "/Users/Yoseph/shuttl/Webpage/models.py", line 240, in children
    for i in Class.objects.filter(parent=self):
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/manager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/query.py", line 790, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/query.py", line 808, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/sql/query.py", line 1243, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/sql/query.py", line 1269, in _add_q
    allow_joins=allow_joins, split_subq=split_subq,
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/sql/query.py", line 1174, in build_filter
    self.check_related_objects(field, value, opts)
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/sql/query.py", line 1071, in check_related_objects
    self.check_query_object_type(value, opts, field)
  File "/Users/Yoseph/.venv/shuttl/src/django/django/db/models/sql/query.py", line 1055, in check_query_object_type
    (value, opts.object_name))
ValueError: Cannot query "root": Must be "Directory" instance.

我打印出了类型,它是一个Directory实例。我通过在Class.objects.filter(parent = self)中改变i来解决这个问题:在Class.objects.filter中改为i(parent_id = self.id):这解决了这个错误但导致了一个不同的错误,甚至更少感:

======================================================================
ERROR: test_renderSite (testing.tests.test_webpage.test_models.test_webpage.WebsiteTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/Yoseph/shuttl/testing/tests/test_webpage/test_models/test_webpage.py", line 90, in test_renderSite
    self.assertEqual(self.website.getSiteMap(), testMap)
  File "/Users/Yoseph/shuttl/Webpage/models.py", line 155, in getSiteMap
    return self.root.render()
  File "/Users/Yoseph/shuttl/Webpage/models.py", line 253, in render
    renderMap["children"].append(i.render())
AttributeError: 'Directory' object has no attribute 'render'

----------------------------------------------------------------------

如果您引用第二个pastebin,您会注意到Directory类确实有一个render方法。我完全难过了。你们有什么猜测吗? 提前致谢。

测试文件:http://pastebin.com/m9VKDLhE 型号代码段:http://pastebin.com/n3906RC8

我也在django用户组中发布了这个问题:https://groups.google.com/forum/#!topic/django-users/94VMeCGXbZ0

0 个答案:

没有答案