40

私は Django プロジェクトに取り組んでおり、そのユニットテストを書いています。ただし、テストでは、ユーザーをログインしようとすると、次のエラーが発生します。

MessageFailure: You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware

実際のサイトへのログインは正常に機能し、MessageMiddleware を使用してログイン メッセージが表示されます。

私のテストでは、これを行うと:

from django.conf import settings
print settings.MIDDLEWARE_CLASSES

次に、これを出力します。

('django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware')

テストの実行時に MessageMiddleware がインストールされていることを示しているように見えます。

私が見逃している明らかなステップはありますか?

アップデート

以下の提案の後、それは設定の問題のように見えます。

私は現在settings/__init__.pyこのようなものを持っています:

try:
    from settings.development import *
except ImportError:
    pass

またsettings/defaults.py、ほとんどの標準設定 ( を含むMIDDLEWARE_CLASSES) が含まれています。そして、settings.development.pyこれらのデフォルトのいくつかを次のようにオーバーライドします。

from defaults import *

DEBUG = True
# etc

私の開発サイト自体は、開発設定を使用して正常に動作しているようです。しかし、テストは設定をロードしているように見えますが、OK (デフォルトと開発の両方)settings.DEBUGは に設定されていFalseます。なぜなのか、それが問題の原因なのかどうかはわかりません。

4

9 に答える 9

66

Django 1.4は、このエラーをトリガーする可能性のあるRequestFactoryを使用してリクエストを作成すると、予期される動作をします。

この問題を解決するには、RequestFactoryを使用してリクエストを作成し、次のようにします。

from django.contrib.messages.storage.fallback import FallbackStorage
setattr(request, 'session', 'session')
messages = FallbackStorage(request)
setattr(request, '_messages', messages)

私のために働く!

于 2012-08-17T19:18:17.190 に答える
0

テストは、カスタム (テスト) データベースを作成します。そこにメッセージがないか何かがあるかもしれません...おそらくsetUp()フィクスチャか何かが必要ですか?

適切に回答するには、さらに情報が必要です。

単に次のようなことをしないのはなぜですか?デバッグモードでテストを実行してもよろしいですか?

# settings.py
DEBUG = True

from django.conf import settings
# where message is sent:
if not settings.DEBUG:
    # send your message ... 
于 2012-08-13T17:24:45.103 に答える
0

settings.py は 1 つしかありませんか?

于 2012-08-13T16:23:32.087 に答える
0

これは、以下のヘルパー クラスを作成することで、Tarsis Azevedo の回答に基づいています。MessagingRequest

たとえば、KittenAdmin100% のテスト カバレッジを取得したい場合:

from django.contrib import admin, messages

class KittenAdmin(admin.ModelAdmin):
    def warm_fuzzy_method(self, request):
        messages.warning(request, 'Can I haz cheezburger?')

たとえば、ファイルMessagingRequestで使用するヘルパー クラスを作成しました。test_helpers.py

from django.contrib.messages.storage.fallback import FallbackStorage
from django.http import HttpRequest

class MessagingRequest(HttpRequest):
    session = 'session'

    def __init__(self):
        super(MessagingRequest, self).__init__()
        self._messages = FallbackStorage(self)

    def get_messages(self):
        return getattr(self._messages, '_queued_messages')

    def get_message_strings(self):
        return [str(m) for m in self.get_messages()]

次に、標準の Django でtests.py:

from django.contrib.admin.sites import AdminSite
from django.test import TestCase

from cats.kitten.admin import KittenAdmin
from cats.kitten.models import Kitten
from cats.kitten.test_helpers import MessagingRequest

class KittenAdminTest(TestCase):
    def test_kitten_admin_message(self):
        admin = KittenAdmin(model=Kitten, admin_site=AdminSite())
        expect = ['Can I haz cheezburger?']
        request = MessagingRequest()
        admin.warm_fuzzy_method(request)
        self.assertEqual(request.get_message_strings(), expect)

結果:

coverage run --include='cats/kitten/*' manage.py test; coverage report -m
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Destroying test database for alias 'default'...
Name                                     Stmts   Miss  Cover   Missing
----------------------------------------------------------------------
cats/kitten/__init__.py                      0      0   100%   
cats/kitten/admin.py                         4      0   100%   
cats/kitten/migrations/0001_initial.py       5      0   100%   
cats/kitten/migrations/__init__.py           0      0   100%   
cats/kitten/models.py                        3      0   100%   
cats/kitten/test_helpers.py                 11      0   100%   
cats/kitten/tests.py                        12      0   100%   
----------------------------------------------------------------------
TOTAL                                       35      0   100%   
于 2016-04-21T03:33:41.227 に答える
-1

ミドルウェアに問題がある場合は、「単体テスト」を行っていません。単体テストは、機能の単位をテストします。システムの他の部分とやり取りする場合、「統合」テストと呼ばれるものを作成しています。

より良いテストを書くように努めるべきであり、この種の問題は起こらないはずです。RequestFactoryを試してください。;)

def test_some_view(self):
    factory = RequestFactory()
    user = get_mock_user()
    request = factory.get("/my/view")
    request.user = user
    response = my_view(request)
    self.asssertEqual(status_code, 200)
于 2012-08-13T17:34:30.257 に答える