Тесты Django начали проваливаться после добавления объектов Wagtail
Я использую регулярные тесты Django для своих моделей Django, используя
./manage.py test non_wagtail_app_name
но внезапно (и после добавления некоторых моделей трясогузок) я не могу запустить их:
Creating test database for alias 'default'...
Traceback (most recent call last):
File "./manage.py", line 12, in <module>
execute_from_command_line(sys.argv)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
utility.execute()
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/commands/test.py", line 29, in run_from_argv
super(Command, self).run_from_argv(argv)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/commands/test.py", line 62, in handle
failures = test_runner.run_tests(test_labels)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/test/runner.py", line 601, in run_tests
old_config = self.setup_databases()
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/test/runner.py", line 546, in setup_databases
self.parallel, **kwargs
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/test/utils.py", line 187, in setup_databases
serialize=connection.settings_dict.get('TEST', {}).get('SERIALIZE', True),
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/backends/base/creation.py", line 69, in create_test_db
run_syncdb=True,
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/__init__.py", line 131, in call_command
return command.execute(*args, **defaults)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/core/management/commands/migrate.py", line 204, in handle
fake_initial=fake_initial,
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/migrations/executor.py", line 115, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/migrations/executor.py", line 145, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/migrations/executor.py", line 244, in apply_migration
state = migration.apply(state, schema_editor)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/migrations/migration.py", line 129, in apply
operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/migrations/operations/fields.py", line 88, in database_forwards
field,
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 431, in add_field
definition, params = self.column_sql(model, field, include_default=True)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 171, in column_sql
default_value = self.effective_default(field)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/backends/base/schema.py", line 245, in effective_default
default = field.get_db_prep_save(default, self.connection)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 770, in get_db_prep_save
prepared=False)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 762, in get_db_prep_value
value = self.get_prep_value(value)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/wagtail/core/fields.py", line 106, in get_prep_value
return json.dumps(self.stream_block.get_prep_value(value), cls=DjangoJSONEncoder)
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/wagtail/core/blocks/stream_block.py", line 252, in get_prep_value
for child in value # child is a StreamChild instance
File "/home/fleon/development/virmyasb/lib/python3.6/site-packages/wagtail/core/blocks/stream_block.py", line 252, in <listcomp>
for child in value # child is a StreamChild instance
AttributeError: 'str' object has no attribute 'block'
Трассировка, кажется, происходит от части моего проекта Wagtail (мои модели Wagtail используют StreamFields и BlockFields), поэтому мне кажется, что я что-то упускаю (помещаю осветительные приборы для моих объектов Wagtail), но я не знаю, с чего начать (я еще не настроил тесты Wagtail - да, я знаю, я должен). Приложение, которое я хочу протестировать, не использует ничего из Wagtail.
Единственное, что работает, - это pg_dumping моей базы данных Postgres, отредактируйте имя базы данных в сгенерированном файле, импортируйте его в test_postgres и передайте ключ -k тесту manage.py, поэтому совершенно очевидно, что мне нужно предварительно заполнить таблицы Wagtail. Однако использование приборов в тестах моделей Django не решает проблему...
1 ответ
Это не удается во время выполнения миграций. Копаясь в трассировке стека, я думаю, что:
- это миграция, которая добавляет
StreamField
к существующей модели страницы, как требуется (null=False
) поле - существует существующий экземпляр этой модели страницы (скорее всего, это HomePage, так как стандартный шаблон проекта Wagtail создает один из них как часть начальной миграции), поэтому его необходимо заполнить значением по умолчанию
- значение по умолчанию, которое вы указали при создании миграции, является непустой строкой, которая не является допустимым значением для StreamField
Если это так, исправление состоит в том, чтобы отредактировать нарушающую миграцию и изменить default
значение в StreamField в пустую строку.