首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在单元测试期间在Django RequestFactory中设置消息传递和会话中间件

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

Stack Overflow用户
提问于 2014-05-26 00:15:57
回答 3查看 2.6K关注 0票数 15

我需要测试一个函数,该函数以请求作为其参数。它不会被URL公开为视图,所以我不能用测试客户端来测试它。

我需要向它传递一个请求对象,并且请求对象需要启用消息传递中间件,因为在函数中使用了消息传递中间件。

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

它不支持中间件。如果视图需要正常工作,则会话和身份验证属性必须由测试本身提供。

如何使用RequestFactory?设置消息中间件?我想我还需要会话中间件来使消息中间件工作。

这是我的测试目前在使用普通RequestFactory时产生的错误。

代码语言:javascript
运行
复制
MessageFailure: You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware

这是我正在测试的函数,如果它有助于理解这个问题:

代码语言:javascript
运行
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-26 00:36:30

这个问题是提出来,所以正如上面所说的,您可以使用该代码修复单元测试:

代码语言:javascript
运行
复制
from django.contrib.messages.storage.fallback import FallbackStorage
setattr(request, 'session', 'session')
messages = FallbackStorage(request)
setattr(request, '_messages', messages)
票数 22
EN

Stack Overflow用户

发布于 2014-05-26 00:21:55

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

代码语言:javascript
运行
复制
import mock

request = mock.MagicMock()

# Call your function using the mocked request
store_to_request(request)
票数 4
EN

Stack Overflow用户

发布于 2022-02-10 13:48:19

与Danag的anwer有效地等效的方法是,在将请求对象传递给视图/函数之前,通过会话的process_request方法和消息中间件(按该顺序):

代码语言:javascript
运行
复制
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)

为了方便起见,您可以使用一种方法进行上述操作:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23861157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档