我正试图从使用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())

那么RequestFactoryClient之间的差异:
它已经开发了一点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/

10-10 14:12