django RequestFactory丢失了url kwargs

时间:2018-02-02 10:16:29

标签: python django

我正在尝试从使用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的重点是什么?或者有办法以某种方式将它们放入视图中吗?

1 个答案:

答案 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())

然后RequestFactoryClient之间的差异: 它已经开发了一点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功能测试更相关单元测试(如果你开始嘲笑东西)。

请参阅Request Factory Reference

如果您对单元测试和模拟方法感兴趣,那么关于此的文献不多,但您可以查看本文(在隔离中测试Django视图)[https://matthewdaly.co.uk/blog/2015/08/02/testing-django-views-in-isolation/]

最后,这一切都取决于你的时间可以集中在测试上。集成/功能/单元测试具有不同的优点和缺点。