![](/img/trans.png)
[英]Django Unit Testing : MultipleChoiceField dependent on objects created during setUp
[英]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.