Was bedeutet "falsch importiertes Testmodul"?

82

Ich habe einen Arbeitstest Zeile für Zeile kopiert und nur ein paar Namen geändert (zumindest dachte ich das) und jetzt erhalte ich diesen sehr kryptischen Fehler: (Ich habe einige Sachen durch FOO, BAR ersetzt)

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

Das Problem ist, dass ich den Fehler überhaupt nicht verstehe. Was bedeutet diese Fehlermeldung?

Komplette Stapelverfolgung:

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
quelle
Können Sie den vollständigen Stack-Trace veröffentlichen?
Daniel Hepper
Bitte fügen Sie den beteiligten Dateibaum hinzu, um die Struktur und die Datei zu überprüfen, in die Sie importieren tests
möchten

Antworten:

203

Nach meiner Erfahrung werden seltsame ImportErrors beim Ausführen von Tests durch einen ImportError im Testmodul selbst verursacht.

Stellen Sie sicher, dass Ihr Testmodul importiert werden kann:

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

Bearbeiten:

Wenn dies zu einem Fehler führt, stellen Sie sicher, dass Sie nicht sowohl ein Verzeichnis foo/exports/testsals auch eine Datei habenfoo/exports/tests.py

Daniel Hepper
quelle
Ja, es heißt, dass es kein solches Modul gibt. Aber die Datei ist da. Was kann ich sonst noch tun?
Jonalv
59
Haben Sie vielleicht sowohl ein Verzeichnis foo/exports/testsals auch eine Datei foo/exports/tests.py?
Daniel Hepper
46
Oh, da war eine Django-Automagic- tests.pyDatei. Schöner Fang. Und was für eine kryptische Fehlermeldung ... :(
jonalv
9
Die Django Automatic Tests.py hat mich auch erwischt
Dr. Manhattan
2
Ihre Bearbeitung hat mich gerettet! Beim Ausführen von startapp hat django eine tests.py-Datei erstellt. Ich konnte tests.py in die Shell importieren
Daniel Butler
68

Überprüfen Sie, wie Daniel Hepper in einem Kommentar oben sagte, ob Sie sowohl einen app/testsOrdner als auch eine app/tests.pyDatei in Ihrer App haben.

Django startapperstellt tests.pyautomatisch eine Datei, sodass möglicherweise eine Datei vorhanden ist, die Sie nicht bemerkt haben.

Wenn Sie die automatisch generierte tests.pyDatei einfach löschen , sollte dies funktionieren. (Natürlich sollten Sie den Inhalt der Datei überprüfen, bevor Sie etwas löschen!)

Brendan Quinn
quelle
Ehrfürchtiger Herr, es spart meine Zeit: *
Usama Nadeem
5

Wenn Sie ein Verzeichnis mit dem Namen tests erstellt und Testdateien darin geschrieben haben, z. B. test_views.py, test_models.py usw., müssen Sie die Datei 'test.py' entfernen, die automatisch mit dem Befehl 'python manage.py' erstellt wurde startapp '

Vipin Gupta
quelle
1

Nur um der Liste der möglichen Fälle hinzuzufügen.

Dies kann auch in einer virtuellen Umgebung geschehen, wenn das Paket, auf dem Sie sich befinden, lokal installiert wurde.

In diesem Fall müssen Sie nur die installierte Version deinstallieren und mit dem Befehl "Entwickeln" erneut verknüpfen (ich kenne den richtigen Begriff nicht)

~/dev/stufflib% pip uninstall stufflib
~/dev/stufflib% python setup.py develop
~/dev/stufflib% python setup.py test
Romuald Brunet
quelle
0

In meinem Fall war das Problem, weil ich versucht habe, die Django-Testaufgabe vom Symlink zum Ordner mit dem Projekt zu starten, nicht vom "echten" Pfad. Wenn ich die Django-Testaufgabe im Projektordner ohne Symlink ausführe, wird dieser Fehler nicht angezeigt.

Aleksandr Aksarin
quelle
0

Überprüfen Sie, ob Sie sowohl einen app/testsOrdner als auch eine app / tests.py haben

Datei in Ihrer App.

Standardmäßig heißt eine Datei automatisch tests.pydiese Datei löschen, wenn der Fehler behoben ist

Abednego
quelle