Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件_Python_Django_Unit Testing - Fatal编程技术网

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

Python 在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件,python,django,unit-testing,Python,Django,Unit Testing,我需要测试一个函数,它以一个请求作为参数。它没有按URL作为视图公开,因此我无法使用测试客户端对其进行测试 我需要向它传递一个请求对象,请求对象需要启用消息传递中间件,因为函数中使用了消息传递中间件 我正在使用RequestFactory创建我的请求。报告说: 它不支持中间件。如果视图需要正常运行,则测试本身必须提供会话和身份验证属性 如何使用RequestFactory设置消息传递中间件?我想我还需要会话中间件使消息传递中间件工作 这是我的测试当前在使用香草RequestFactory时产生的

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

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

我正在使用RequestFactory创建我的请求。报告说:

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

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

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

MessageFailure: You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware
这是我正在测试的函数,以防它有助于理解此问题:

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)

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

import mock

request = mock.MagicMock()

# Call your function using the mocked request
store_to_request(request)
如前所述,您可以使用该代码修复单元测试:

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

这是一个很好的答案,我将在测试中与模拟调用参数一起使用它。不幸的是,它不允许我调用模拟请求对象上的django.contrib.messages.get_messages(请求)来查看请求中保存了哪些消息。我想测试输出消息以确保它们被正确保存。请注意,您可以在模拟请求上设置属性和函数,以实现所需的行为。请求对象作为参数从消息中间件传递到add_messages函数。(您可以在上面的代码片段中看到)。这使得通过简单地添加属性进行测试变得非常困难。它需要添加正确的支持功能。非常感谢!工作得很有魅力。