首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django消息中间件在测试post请求时出现问题

Django消息中间件在测试post请求时出现问题
EN

Stack Overflow用户
提问于 2019-04-25 06:57:48
回答 2查看 1.3K关注 0票数 6

我正在尝试测试一个UpdateView,它向重定向成功页面添加了一条消息。似乎我的问题来自于messages,因为pytest返回:

django.contrib.messages.middleware.MessageMiddleware :如果不安装django.contrib.messages.api.MessageFailure,就不能添加消息

我的测试代码是:

代码语言:javascript
复制
def test_authenticated_staff(self, rf):
    langues = LanguageCatalog.objects.create(
        lang_src='wz',
        lang_dest='en',
        percent='4'
    )
    req = rf.get(reverse("dashboard.staff:lang-update", kwargs={'pk': langues.pk}))
    data = {'lang_src': 'it',
            'lang_dest': 'en',
            'percent': '34'}
    req = rf.post(reverse(
        "dashboard.staff:lang-update", kwargs={'pk': langues.pk}), data=data)
    req.user = UserFactory()
    resp = views.LangUpdateView.as_view()(req, pk=langues.pk)

我精确地指出,MessageMiddleware存在于MIDDLEWARE设置中。我用Django==2.0.13

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 07:55:06

我找到了解决办法。为了测试这样的请求,您首先需要用一个会话来注释它,然后用一个消息来注释它。实际上,它的意思是添加以下几行:

代码语言:javascript
复制
from django.contrib.messages.middleware import MessageMiddleware
from django.contrib.sessions.middleware import SessionMiddleware

# in your test method:
"""Annotate a request object with a session"""
middleware = SessionMiddleware()
middleware.process_request(req)
req.session.save()

"""Annotate a request object with a messages"""
middleware = MessageMiddleware()
middleware.process_request(req)
req.session.save()

# and then (in my case)
resp = views.LangUpdateView.as_view()(req, pk=langues.pk)
票数 14
EN

Stack Overflow用户

发布于 2020-10-13 20:19:20

您还可以在一个单独的上下文管理器中移动手动请求注释,可以在多个测试中重用它,代码如下所示:

代码语言:javascript
复制
import contextlib

from django.contrib.messages.middleware import MessageMiddleware
from django.contrib.sessions.middleware import SessionMiddleware


@contextlib.contextmanager
def middleware(request):
    """Annotate a request object with a session"""
    middleware = SessionMiddleware()
    middleware.process_request(request)
    request.session.save()

    """Annotate a request object with a messages"""
    middleware = MessageMiddleware()
    middleware.process_request(request)
    request.session.save()
    yield request


def test_authenticated_staff(self, rf):
    langues = LanguageCatalog.objects.create(
        lang_src='wz',
        lang_dest='en',
        percent='4'
    )
    req = rf.get(reverse("dashboard.staff:lang-update", kwargs={'pk': langues.pk}))
    data = {'lang_src': 'it',
            'lang_dest': 'en',
            'percent': '34'}
    req = rf.post(reverse("dashboard.staff:lang-update", kwargs={'pk': langues.pk}), data=data)
    req.user = UserFactory()
    with middleware(req):  # << !
        resp = views.LangUpdateView.as_view()(req, pk=langues.pk)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55843504

复制
相关文章

相似问题

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