Why don't my Django unittests know that MessageMiddleware is installed?

前端 未结 9 688
傲寒
傲寒 2020-12-14 05:54

I\'m working on a Django project and am writing unittests for it. However, in a test, when I try and log a user in, I get this error:

MessageFailure: You can         


        
9条回答
  •  囚心锁ツ
    2020-12-14 06:39

    This builds on Tarsis Azevedo's answer by creating a MessagingRequest helper class below.

    Given say a KittenAdmin I'd want to get 100% test coverage for:

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

    I created a MessagingRequest helper class to use in say a test_helpers.py file:

    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()]
    

    Then in a standard 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)
    

    Results:

    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%   
    

提交回复
热议问题