【问题标题】:Accessing Middleware value for testing a Django DetailView访问中间件值以测试 Django DetailView
【发布时间】:2018-08-13 04:28:01
【问题描述】:

我正在为 DetailView 编写一个测试,该测试通过访问中间件中设置的值来查询 get_object()。这适用于公司应用程序和公司模型。每个用户都在一个公司中。

为了在整个项目中访问公司,我通过自定义中间件在请求上设置了当前用户的 Company.uuid。

中间件

from django.utils.deprecation import MiddlewareMixin

class DynamicCompanyUUIDMiddleware(MiddlewareMixin):
    """ Adds the current organization's UUID from the current user."""

    def process_request(self, request):
        try:
            company_uuid = request.user.company_uuid
        except:
            company_uuid = None
        request.company_uuid = company_uuid

通过我用于其他公司视图的 Mixin 在 CompanyDetailView 的 get_object() 方法中使用它。

混音

class CompanyMixin(LoginRequiredMixin, SetHeadlineMixin):
    model = Company

    def get_object(self):
        return get_object_or_404(
            self.model,
            uuid=self.request.user.company_uuid)

测试

我要写的测试是:

from django.test import RequestFactory
from django.urls import reverse, resolve
from test_plus.test import TestCase
from ..models import Company
from ..views import CompanyDetailView

class BaseCompanyTestCase(TestCase):

    def setUp(self):
        self.user = self.make_user()
        self.object = Company.objects.create(owner=self.user, name="testcompany")
        self.user.company_uuid = self.object.uuid
        self.factory = RequestFactory()

class TestCompanyDetailView(BaseCompanyTestCase):

    def setUp(self):
        super(TestCompanyDetailView, self).setUp()
        self.client.login(username="testuser", password="password")
        self.view = CompanyDetailView()
        self.view.object = self.object
        request = self.factory.get(reverse('companies:detail'))
        request.user = self.user
        request.company_uuid = self.user.company_uuid
        response = CompanyDetailView.as_view()(request)
        self.assertEqual(response.status_code, 200)

    def test_get_headline(self):
        self.assertEqual(
            self.view.get_headline(),
            '%s Members' % self.object.name

结果

这会导致 404 并找不到测试用户的公司。

走过它:

  • 我创建用户
  • 为这个新的测试用户创建公司
  • 设置 user.company_uuid
  • 这应该允许 mixin 访问 company_uuid
  • 因此在请求中返回用户的公司

但是,我不会像 404 显示的那样返回公司。

问题

我在哪里错了?提前感谢您的帮助。

回答

我正在混合 Django 的 Client 和 RequestFactory。我已经更正了上面正确的代码。

【问题讨论】:

  • 你在哪里创建用户和公司?
  • 很好,添加到上面的代码中。我有一个 BaseTestCase 我把这个逻辑放在 setUp()

标签: django django-views django-testing


【解决方案1】:

我正在混合 Django 的 Client 和 RequestFactory。走开之后,我在下面想通了——

from django.test import RequestFactory
from django.urls import reverse, resolve
from test_plus.test import TestCase
from ..models import Company
from ..views import CompanyDetailView

class BaseCompanyTestCase(TestCase):

    def setUp(self):
        self.user = self.make_user()
        self.object = Company.objects.create(owner=self.user, name="testcompany")
        self.user.company_uuid = self.object.uuid
        self.factory = RequestFactory()

class TestCompanyDetailView(BaseCompanyTestCase):

    def setUp(self):
        super(TestCompanyDetailView, self).setUp()
        self.client.login(username="testuser", password="password")
        self.view = CompanyDetailView()
        self.view.object = self.object
        request = self.factory.get(reverse('companies:detail'))
        request.user = self.user
        request.company_uuid = self.user.company_uuid
        response = CompanyDetailView.as_view()(request)
        self.assertEqual(response.status_code, 200)

    def test_get_headline(self):
        self.assertEqual(
            self.view.get_headline(),
            '%s Members' % self.object.name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多