我正在尝试从使用Django Test Client切换到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": "{}"}
那么,RequestFactory
如果它丢失了url kwargs的重点是什么?或者有办法以某种方式将它们放入视图中吗?
答案 0 :(得分:6)
你的答案有两个方面。
首先,如何将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
处理用于处理响应的整个堆栈,包括中间件和网址解析(网址匹配和参数提取)。另一方面RequestFactory
,只需构建一个请求对象,让用户负责添加适当的属性并调用相应的视图函数或查看方法。
因此在第二种情况下呼叫ClassView.as_view()(request, *args, **kwargs)
。
就测试而言,Client
专注于集成测试(您将测试所有不同的部分是否适合:中间件,基于类/功能视图,模板,templatetags),这是你在这里测试的端到端机制。
客户 - &gt; {UrlResolver - &gt;中间件 - &gt;查看 - &gt;中间件 - &gt; TemplateResponse} - &gt;测试
使用RequestFactory
,您可以专注于测试较小的部分,基于类的视图方法,功能视图,中间件方法等。在这种意义上,RequestFactory
与功能测试更相关或单元测试(如果你开始嘲笑东西)。
如果您对单元测试和模拟方法感兴趣,那么关于此的文献不多,但您可以查看本文(在隔离中测试Django视图)[https://matthewdaly.co.uk/blog/2015/08/02/testing-django-views-in-isolation/]。
最后,这一切都取决于你的时间可以集中在测试上。集成/功能/单元测试具有不同的优点和缺点。