Django 1.7.1 のユニットテストをPyDevで実行するとAppRegistryNotReadyが発生する
Eclipse + PyDev で、Django1.7.1 のユニットテストを実行すると、AppRegistryNotReady エラーとなる。
とりあえず、リクエストの結果を取りたいだけで、別段変わったことはしていない。のに。。。
# -*- encoding:utf-8 -*- from django.conf import settings from django.test import TestCase from django.test.client import Client from phraseit import * class ViewTest(TestCase): def test_home(self): c = Client() req_param = {} res = c.get('/', req_param) print res.status_code print res
実行すると、こんなエラー。
普通に実行は可能で、ブラウザから実行結果は確認できるのだが、ユニットテストだとだめ。
Finding files... done. Importing test modules ... done. Creating test database for alias 'default'... Traceback (most recent call last): File "C:\Programs\eclipse-luna-pydev\plugins\org.python.pydev_3.9.2.201502050007\pysrc\runfiles.py", line 234, inmain() File "C:\Programs\eclipse-luna-pydev\plugins\org.python.pydev_3.9.2.201502050007\pysrc\runfiles.py", line 78, in main return pydev_runfiles.main(configuration) # Note: still doesn't return a proper value. File "C:\Programs\eclipse-luna-pydev\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydev_runfiles.py", line 835, in main PydevTestRunner(configuration).run_tests() File "C:\Programs\eclipse-luna-pydev\plugins\org.python.pydev_3.9.2.201502050007\pysrc\pydev_runfiles.py", line 793, in run_tests MyDjangoTestSuiteRunner(run_tests).run_tests([]) File "C:\Programs\venv\phrase_env\lib\site-packages\django\test\runner.py", line 147, in run_tests old_config = self.setup_databases() File "C:\Programs\venv\phrase_env\lib\site-packages\django\test\runner.py", line 109, in setup_databases return setup_databases(self.verbosity, self.interactive, **kwargs) File "C:\Programs\venv\phrase_env\lib\site-packages\django\test\runner.py", line 299, in setup_databases serialize=connection.settings_dict.get("TEST", {}).get("SERIALIZE", True), File "C:\Programs\venv\phrase_env\lib\site-packages\django\db\backends\creation.py", line 377, in create_test_db test_flush=True, File "C:\Programs\venv\phrase_env\lib\site-packages\django\core\management\__init__.py", line 93, in call_command app_name = get_commands()[name] File "C:\Programs\venv\phrase_env\lib\site-packages\django\utils\lru_cache.py", line 101, in wrapper result = user_function(*args, **kwds) File "C:\Programs\venv\phrase_env\lib\site-packages\django\core\management\__init__.py", line 73, in get_commands for app_config in reversed(list(apps.get_app_configs())): File "C:\Programs\venv\phrase_env\lib\site-packages\django\apps\registry.py", line 137, in get_app_configs self.check_apps_ready() File "C:\Programs\venv\phrase_env\lib\site-packages\django\apps\registry.py", line 124, in check_apps_ready raise AppRegistryNotReady("Apps aren't loaded yet.") django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
ググってみると、以下の処理を差し込む必要があるようだ。
https://docs.djangoproject.com/en/1.7/releases/1.7/
If you’re using Django in a plain Python script — rather than a management command — and you rely on theDJANGO_SETTINGS_MODULE environment variable, you must now explicitly initialize Django at the beginning of your script with:
>>> import django >>> django.setup()Otherwise, you will hit an AppRegistryNotReady exception.
テストケースに、上記の import django, dango.setup() を追記してみる。
# -*- encoding:utf-8 -*- from django.conf import settings from django.test import TestCase from django.test.client import Client from phraseit import * import django django.setup() class ViewTest(TestCase): def test_home(self): c = Client() req_param = {} res = c.get('/', req_param) print res.status_code print res
成功。
とりあえずよかった。よかった。