Что означает «неправильно импортирован модуль тестов»?

82

Я скопировал рабочий тест построчно и просто изменил несколько имен (по крайней мере, так я думал), и теперь я получаю очень загадочную ошибку: (Я заменил кое-что на FOO, BAR)

ImportError: 'tests' module incorrectly imported from 'FOO/exports/tests'. Expected 'FOO/exports'. Is this module globally installed?

Проблема в том, что я вообще не понимаю ошибку. Что означает это сообщение об ошибке?

Полная трассировка стека:

Traceback (most recent call last):
  File "BAR/modeling/manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 30, in run_from_argv
    super(Command, self).run_from_argv(argv)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 74, in execute
    super(Command, self).execute(*args, **options)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/core/management/commands/test.py", line 90, in handle
    failures = test_runner.run_tests(test_labels)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/test/runner.py", line 531, in run_tests
    suite = self.build_suite(test_labels, extra_tests)
  File "/Users/jonathan/anaconda/lib/python2.7/site-packages/django/test/runner.py", line 451, in build_suite
    tests = self.test_loader.discover(start_dir=label, **kwargs)
  File "/Users/jonathan/anaconda/lib/python2.7/unittest/loader.py", line 206, in discover
    tests = list(self._find_tests(start_dir, pattern))
  File "/Users/jonathan/anaconda/lib/python2.7/unittest/loader.py", line 267, in _find_tests
    raise ImportError(msg % (mod_name, module_dir, expected_dir))
ImportError: 'tests' module incorrectly imported from 'FOO/exports/tests'. Expected 'FOO/exports'. Is this module globally installed?
Йоналв
источник
Можете ли вы опубликовать полную трассировку стека?
Дэниел Хеппер,
Пожалуйста, добавьте задействованное дерево файлов, чтобы проверить структуру и файл, в который вы пытаетесь импортироватьtests
trinchet

Ответы:

207

По моему опыту, странные ошибки ImportErrors при запуске тестов вызваны ошибкой ImportError в самом модуле тестов.

Убедитесь, что ваш тестовый модуль можно импортировать:

$ python manage.py shell
...
>>> import foo.exports.tests

Редактировать:

Если это вызывает ошибку, убедитесь, что у вас нет и каталога, foo/exports/testsи файла.foo/exports/tests.py

Дэниел Хеппер
источник
Да там написано, что такого модуля нет. Но файл есть. Что еще я могу сделать?
jonalv
62
Может быть, у вас есть и каталог, foo/exports/testsи файл foo/exports/tests.py?
Дэниел Хеппер
47
О, там был tests.pyфайл автомагии Django . Хорошо поймал. И какое загадочное сообщение об ошибке ... :(
jonalv
9
django automatic tests.py тоже поймал меня
Доктор Манхэттен
2
Ваше правка - вот что меня спасло! При запуске startapp django создал файл tests.py. Мне удалось импортировать tests.py в оболочку
Дэниел Батлер,
72

Как сказал Дэниел Хеппер в комментарии выше, попробуйте проверить, есть ли в вашем приложении app/testsи папка, и app/tests.pyфайл.

Django startappсоздает tests.pyфайл автоматически, поэтому может быть файл, который вы не заметили.

Если вы просто удалите автоматически созданный tests.py файл, он должен работать. (Очевидно, вы должны проверить содержимое файла, прежде чем что-либо удалять!)

Брендан Куинн
источник
1
Потрясающе, сэр, это сэкономит мое время: *
Усама Надим
5

Если вы создали каталог с именем tests и записали в него тестовые файлы, например, test_views.py, test_models.py и т. Д., Убедитесь, что вы удалили файл test.py, созданный автоматически командой python manage.py startapp '

Випин Гупта
источник
1

Просто чтобы добавить к списку возможных случаев.

Это также может произойти внутри виртуального окружения, если пакет, в котором вы находитесь, был установлен локально.

В этом случае вам просто нужно удалить версию, которая была установлена, и "повторно связать" ее (я не знаю правильный термин) с помощью команды develop

~/dev/stufflib% pip uninstall stufflib
~/dev/stufflib% python setup.py develop
~/dev/stufflib% python setup.py test
Ромуальд Брюне
источник
1

Попробуйте проверить, есть ли у вас и app/testsпапка, и app / tests.py

файл в вашем приложении.

По умолчанию файл автоматически называется tests.pyудалить этот файл, если ошибка будет устранена.

Абеднего
источник
0

В моем случае проблема заключалась в том, что я пытался запустить тестовую задачу django с символической ссылки на папку с проектом, а не с «реального» пути. Когда я запускаю тестовую задачу django из папки проекта, не используя символическую ссылку, я не получаю эту ошибку.

Александр Аксарин
источник