我需要测试一个函数,该函数以请求作为其参数。它不会被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)
发布于 2014-05-26 00:36:30
这个问题是提出来,所以正如上面所说的,您可以使用该代码修复单元测试:
from django.contrib.messages.storage.fallback import FallbackStorage
setattr(request, 'session', 'session')
messages = FallbackStorage(request)
setattr(request, '_messages', messages)
发布于 2014-05-26 00:21:55
如果不需要测试请求对象本身的行为,可以使用模拟库而不是RequestFactory来模拟请求:
import mock
request = mock.MagicMock()
# Call your function using the mocked request
store_to_request(request)
发布于 2022-02-10 13:48:19
与Danag的anwer有效地等效的方法是,在将请求对象传递给视图/函数之前,通过会话的process_request方法和消息中间件(按该顺序):
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
https://stackoverflow.com/questions/23861157
复制相似问题