Co oznacza niepoprawnie zaimportowany moduł „testy”?

82

Skopiowałem działający test linia po linii i właśnie zmieniłem kilka nazw (przynajmniej tak myślałem), a teraz pojawia się ten bardzo tajemniczy błąd: (Zastąpiłem niektóre rzeczy FOO, BAR)

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

Problem w tym, że w ogóle nie rozumiem błędu. Co oznacza ten komunikat o błędzie?

Kompletny ślad stosu:

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?
jonalv
źródło
Czy możesz opublikować pełny ślad stosu?
Daniel Hepper
Dodaj odpowiednie drzewo plików, aby sprawdzić strukturę i plik, do którego próbujesz zaimportowaćtests
trinchet

Odpowiedzi:

207

Z mojego doświadczenia wynika, że ​​dziwne błędy ImportErrors podczas uruchamiania testów są powodowane przez błąd ImportError w samym module testów.

Upewnij się, że moduł testów można zaimportować:

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

Edytować:

Jeśli to spowoduje błąd, upewnij się, że nie masz jednocześnie katalogu foo/exports/testsi plikufoo/exports/tests.py

Daniel Hepper
źródło
Tak, jest napisane, że nie ma takiego modułu. Ale plik tam jest. Co jeszcze mogę zrobić?
jonalv
62
Czy masz może katalog foo/exports/testsi plik foo/exports/tests.py?
Daniel Hepper
47
Och, był tests.pytam plik automagiczny Django . Dobry chwyt. A co za tajemniczy komunikat o błędzie ... :(
jonalv
9
django automatic tests.py też mnie złapał
Dr Manhattan
2
Twoja zmiana mnie uratowała! Podczas uruchamiania startapp django utworzył plik tests.py. Udało mi się zaimportować tests.py w powłoce
Daniel Butler
72

Jak Daniel Hepper powiedział w powyższym komentarzu, spróbuj sprawdzić, czy masz w aplikacji zarówno app/testsfolder, jak i app/tests.pyplik.

Django startapptworzy tests.pyplik automatycznie, więc może istnieć plik, którego nie zauważyłeś.

Jeśli po prostu usuniesz automatycznie wygenerowany tests.pyplik, powinien działać. (Oczywiście przed usunięciem czegokolwiek należy sprawdzić zawartość pliku!)

Brendan Quinn
źródło
1
Niesamowity Panie, to oszczędza mój czas: *
Usama Nadeem
5

W przypadku, gdy utworzyłeś katalog o nazwie testy i zapisałeś w nim pliki testowe, np. Test_views.py, test_models.py itp., Upewnij się, że usunąłeś plik „test.py” utworzony automatycznie przez polecenie „python manage.py” startapp '

Vipin Gupta
źródło
1

Wystarczy dodać do listy możliwych przypadków.

Może się to również zdarzyć w wirtualnym środowisku env, gdy pakiet, którego używasz, został zainstalowany lokalnie.

W takim przypadku wystarczy odinstalować zainstalowaną wersję i ponownie ją połączyć (nie znam poprawnego terminu) za pomocą polecenia develop

~/dev/stufflib% pip uninstall stufflib
~/dev/stufflib% python setup.py develop
~/dev/stufflib% python setup.py test
Romuald Brunet
źródło
1

Spróbuj sprawdzić, czy masz zarówno app/testsfolder, jak i plik app / tests.py

plik w swojej aplikacji.

Domyślnie plik jest automatycznie nazywany tests.pyusuń ten plik, jeśli błąd zostanie rozwiązany

Abednego
źródło
0

W moim przypadku problem polegał na tym, że próbowałem uruchomić zadanie testowe django z dowiązania symbolicznego do folderu z projektem, a nie z „prawdziwej” ścieżki. Kiedy uruchamiam zadanie testowe django z folderu projektu bez użycia łącza symbolicznego, nie pojawia się ten błąd.

Aleksandr Aksarin
źródło