Ошибки теста Джанго
Я нахожусь в процессе написания модульных тестов для приложения, над которым я работаю. Мои тесты хорошо работают на моем Macbook Pro 2012 года, но не на iMac 2015 года. Оба работают под управлением последней версии 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
Теперь это работает и помещает фиктивные файлы в БД и избавляется от 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.
Я распечатал тип, и это экземпляр каталога. Я решил эту проблему, изменив для i в Class.objects.filter (parent = self): на для i в Class.objects.filter (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'
----------------------------------------------------------------------
Если вы обратитесь ко второму каталогу, вы заметите, что класс Directory действительно имеет метод render. Я полностью в тупике. У вас есть какие-нибудь догадки? Заранее спасибо.
Тестовый файл: http://pastebin.com/m9VKDLhE Фрагмент модели: http://pastebin.com/n3906RC8
Я также разместил этот вопрос в группе пользователей django здесь: https://groups.google.com/forum/