在Django测试客户端的请求中设置属性
我有一个中间件(tenant_schemas.BaseTenantMiddleware),它将在Django测试客户端的请求中设置属性,django,django-tests,Django,Django Tests,我有一个中间件(tenant_schemas.BaseTenantMiddleware),它将tenant属性注入请求对象。我不能在进行单元测试时使用该中间件 在视图中,我可以从请求中获取租户对象。此视图映射到URL“myapp:member_info” 该视图在项目正常运行时工作,因为中间件将正确设置request.tenant 现在,如果我想测试此视图,我将尝试编写以下测试: class MemberViewTest(TestCase): def setUp(self):
tenant
属性注入请求对象。我不能在进行单元测试时使用该中间件
在视图中,我可以从请求中获取租户对象。此视图映射到URL“myapp:member_info”
该视图在项目正常运行时工作,因为中间件将正确设置request.tenant
现在,如果我想测试此视图,我将尝试编写以下测试:
class MemberViewTest(TestCase):
def setUp(self):
self.tenant = Tenant(name="test tenant")
self.member = Member.objects.create(
first_name='Test',
last_name='Person')
def test_saldo(self):
self.client = Client(tenant=self.tenant) # Here I try to inject the tenant into the request
print(self.client.defaults) # This will print {'tenant': <Tenant: test tenant>}
response = self.client.get(reverse('myapp:member_info', kwargs={ 'tenant': self.tenant, 'member_id': self.member.token }))
因此,django.tests.Client类没有向请求注入默认值
我尝试的一件事是重写RequestFactory(),以便它将注入租户
class TenantRequestFactory(RequestFactory):
def request(self, **request):
req = super().request(**request)
req.tenant = Tenant()
print(req)
return req
class TenantClient(Client, TenantRequestFactory):
pass
views.py
def test_saldo(self):
self.client = TenantClient(tenant=self.tenant)
但是从未调用
TenantRequestFactory.request()
(打印命令未命中)。我不知道我是否应该以其他方式将其子类化?在client.py
中,客户端类是这样创建的:class client(ClientMixin,RequestFactory)
为什么首先要将属性附加到请求?因为,我没有看到request.tenant
any的任何用法,其中的视图是tenant=request.tenant
和ctx['tenant\u name']=tenant.name
,它们使用了租户。我省略了将使用租户名称的模板,因为它不相关。
File "myapp/views.py", line xxx, in get_context_data
tenant = self.request.tenant
AttributeError: 'WSGIRequest' object has no attribute 'tenant'
class TenantRequestFactory(RequestFactory):
def request(self, **request):
req = super().request(**request)
req.tenant = Tenant()
print(req)
return req
class TenantClient(Client, TenantRequestFactory):
pass
views.py
def test_saldo(self):
self.client = TenantClient(tenant=self.tenant)