我正试图从使用django测试客户机切换到requestfactory以加快测试速度。但是,由requestfactory生成的请求没有为视图提供适当的kwargs
。
例:这是我的观点
class SomeView(View):
def get(self, request, *args, **kwargs):
return JsonResponse({'your kwargs': str(kwargs)})
用URLCONF
url(r'^some_view/(?P<some_kwarg>[\-0-9a-fA-F]+)/$',
views.SomeView.as_view(),
name='some_view'),
还有两个测试:
def test_different_kwargs():
c = Client()
response = c.get(
reverse('bots:some_view',
kwargs={'some_kwarg': '12345'}),
)
print('\n\nResponse for TestClient: ', response.content.decode())
rf = RequestFactory()
request = rf.get(
reverse('bots:some_view',
kwargs={'some_kwarg': '12345'}),
)
response = SomeView.as_view()(request)
print('\n\nResponse for RequestFactory: ', response.content.decode())
他们生产的是:
Response for TestClient: {"your kwargs": "{'some_kwarg': '12345'}"}
Response for RequestFactory: {"your kwargs": "{}"}
那么,如果它失去url kwargs,
RequestFactory
的意义是什么?还是有办法把它们放在视野里? 最佳答案
你的回答有两个方面。
首先,如何将kwargs
放到视图中?您需要将代码更改为:
def test_different_kwargs():
kwargs={'some_kwarg': '12345'}
url = reverse('bots:some_view', kwargs=kwargs)
c = Client()
response = c.get(url)
print('\n\nResponse for TestClient: ', response.content.decode())
rf = RequestFactory()
request = rf.get(url)
response = SomeView.as_view()(request, **kwargs)
print('\n\nResponse for RequestFactory: ', response.content.decode())
那么
RequestFactory
和Client
之间的差异:它已经开发了一点here: Django test RequestFactory vs Client但我想完成一点。
在功能方面,
Client
处理整个栈,用于处理响应,包括中间件和URL分辨率(URL匹配和参数提取)。另一方面,只需构建一个请求对象,让用户负责添加适当的属性并调用适当的视图函数或视图方法。因此在第二种情况下调用
RequestFactory
。在测试方面,
ClassView.as_view()(request, *args, **kwargs)
侧重于集成测试(您将测试所有不同的部分是否组合在一起:中间件、基于类/函数视图、模板、模板标记),这是您在这里测试的端到端机制。客户端->{urlsolver->middleware->view->middleware->templateresponse}->tests
使用
Client
可以专注于测试较小的部分、基于类的视图方法、功能视图、中间件方法等。从这个意义上说RequestFactory
与功能测试或单元测试(如果您开始模拟的话)更相关。参阅Request Factory Reference
如果您对单元测试和模拟方法感兴趣,关于这方面的文献并不多,但是您可以看看本文(单独测试django视图)[https://matthewdaly.co.uk/blog/2015/08/02/testing-django-views-in-isolation/]。
最后,这取决于你的时间能集中在测试上。集成/功能/单元测试有不同的优点和缺点。
关于python - django RequestFactory丢失了URL kwargs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48580465/