繁体   English   中英

如何在单元测试期间在 Django RequestFactory 中设置消息传递和 session 中间件

[英]How do I setup messaging and session middleware in a Django RequestFactory during unit testing

我有一个 function 我需要测试它以请求作为参数。 它没有作为 URL 的视图公开,因此我无法使用测试客户端对其进行测试。

我需要向它传递一个请求 object,而请求 object 需要启用消息中间件,因为消息中间件在 function 中使用。

我正在使用 RequestFactory 来创建我的请求。 文件说:

它不支持中间件。 如果需要正确查看 function,则必须由测试本身提供 Session 和身份验证属性。

如何使用 RequestFactory 设置消息传递中间件? 我想我还需要 session 中间件来使消息传递中间件工作

这是我的测试当前在使用 vanilla RequestFactory 时产生的错误。

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

这是我正在测试的 function,以防它有助于理解这个问题:

from django.contrib import messages as django_messages

def store_to_request(self, request):
        """
        Place all the messages stored in this class into message storage in
        the request object supplied.
        :param request: The request object to which we should store all the messages
        :return: Does not return anything
        """
        for message in self._messages:
            django_messages.add_message(request, message.level, message.message, message.extra_tags,
                                    message.fail_silently)

提出此问题,因此,您可以使用该代码修复单元测试:

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

如果您不需要测试请求对象本身的行为,您可以使用模拟库而不是RequestFactory来模拟请求,例如:

import mock

request = mock.MagicMock()

# Call your function using the mocked request
store_to_request(request)

Danag 的 anwer 的有效等效方法是通过 session 的 process_request 方法和消息中间件(按此顺序)传递请求 object,然后再将其传递给视图/函数:

from django.contrib.sessions.middleware import SessionMiddleware
from django.contrib.messages.middleware import MessageMiddleware

request = request_factory.get()
sm = SessionMiddleware()
sm.process_request(request)
mm = MessageMiddleware()
mm.process_request(request)

为方便起见,您可以在方法中执行上述操作:

class MessageDependentTests(TestCase):
    
    def setUp(self):
        self.rf = RequestFactory()
        self.sm = SessionMiddleware()
        self.mm = MessageMiddleware()
        return super().setUp()
        
    def prepare_request(self, request):
        self.sm.process_request(request)
        self.mm.process_request(request)

    def test_something(self):
        request = self.rf.get('/')
        self.prepare_request(request)
        response = my_view(request)
        # test response below

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM