Django

Djangoのテスト時に "ValueError: Missing staticfiles manifest entry" が起きたら

エラーの原因と回避方法は「[Django]DjangoのテストをDEBUG=Trueで実行する」と同じです。状況が少し違ったので、新たな記事を書くことにしました。

エラーが起きた状況

Django 2.0 での開発中、manage.py test myapp を実行したところ、静的ファイルが見つからずにエラーになってしまいました。

$ python manage.py test my_app
Creating test database for alias 'default'...
System check identified no issues (0 silenced).

(snip)

  File "/usr/local/lib/python3.6/site-packages/django/contrib/staticfiles/storage.py", line 422, in stored_name
    raise ValueError("Missing staticfiles manifest entry for '%s'" % clean_name)
ValueError: Missing staticfiles manifest entry for 'my_app/css/default.css'

----------------------------------------------------------------------
Ran 1 test in 0.949s

FAILED (errors=1)
Destroying test database for alias 'default'...

settings.py では DEBUG=True を指定しており、ブラウザ上では該当の CSS ファイルが正しく参照できているので、最初は原因がわかりませんでした。

エラーの原因

エラーの原因は、settings.py で DEBUG=True が指定されていても manage.py test すると DEBUG=False とみなされてテストが実行されるためでした。

DEBUG=False で実行されても静的ファイルが見つかるように manage.py collectstatic すればよいのですが、まだ開発中のため避けたいところです。

エラーの回避方法

Django 1.11 から追加された --debug-mode オプション を指定すれば、DEBUG=True が指定されたものとして実行されます。

$ python manage.py test --debug-mode my_app
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 1.501s

OK
Destroying test database for alias 'default'...

チケット #27008 で、このオプションの追加が議論されていました。