Python 在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件
我需要测试一个函数,它以一个请求作为参数。它没有按URL作为视图公开,因此我无法使用测试客户端对其进行测试 我需要向它传递一个请求对象,请求对象需要启用消息传递中间件,因为函数中使用了消息传递中间件 我正在使用RequestFactory创建我的请求。报告说: 它不支持中间件。如果视图需要正常运行,则测试本身必须提供会话和身份验证属性 如何使用RequestFactory设置消息传递中间件?我想我还需要会话中间件使消息传递中间件工作 这是我的测试当前在使用香草RequestFactory时产生的错误Python 在单元测试期间,如何在Django RequestFactory中设置消息传递和会话中间件,python,django,unit-testing,Python,Django,Unit Testing,我需要测试一个函数,它以一个请求作为参数。它没有按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函数。(您可以在上面的代码片段中看到)。这使得通过简单地添加属性进行测试变得非常困难。它需要添加正确的支持功能。非常感谢!工作得很有魅力。