首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django RequestFactory失去url kwargs

django RequestFactory失去url kwargs
EN

Stack Overflow用户
提问于 2018-02-02 10:16:28
回答 1查看 3.4K关注 0票数 12

我正在尝试从使用Django测试客户端切换到RequestFactory,以加快测试速度。但是,RequestFactory生成的请求没有为视图提供适当的kwargs

这是我的观点

代码语言:javascript
复制
class SomeView(View):
    def get(self, request, *args, **kwargs):
        return JsonResponse({'your kwargs': str(kwargs)})

与urlconf

代码语言:javascript
复制
url(r'^some_view/(?P<some_kwarg>[\-0-9a-fA-F]+)/$',
    views.SomeView.as_view(),
    name='some_view'),

和两项测试:

代码语言:javascript
复制
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())

它们产生的是:

代码语言:javascript
复制
Response for TestClient:  {"your kwargs": "{'some_kwarg': '12345'}"}
Response for RequestFactory:  {"your kwargs": "{}"}

那么,如果RequestFactory失去了url kwargs,它有什么意义呢?或者有什么办法让他们进入视野呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 11:05:40

编辑2020-03-07:随着我在测试方面获得更多经验,我更新了我的答案,以消除围绕功能测试的困惑,并添加了一些建议。

你的回答有两个方面。

快速回答:如何将kwargs放在视图中?您需要将代码更改为:

代码语言:javascript
复制
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())

Long and :那么RequestFactoryClient之间的区别是:它已经开发了一些这里: Django测试RequestFactory和Client,但是我想稍微完成一下。

在功能方面,Client处理用于处理响应的整个堆栈,包括中间件和url分辨率(url匹配和参数提取)。另一方面,RequestFactory只构建一个请求对象,将添加适当属性和调用适当的视图函数或视图方法的责任留给用户。

因此,在第二种情况下调用ClassView.as_view()(request, *args, **kwargs)

在测试方面,Client侧重于集成测试(您将测试所有不同的部分是否匹配在一起:中间件、基于类的/功能视图、模板、模板),这是您在这里测试的端到端机制。

Client -> { UrlResolver ->中间件-> View ->中间件-> TemplateResponse } ->测试

使用RequestFactory,您可以集中精力测试较小的部件、基于类的视图方法、函数视图、中间件方法等。从这个意义上说,RequestFactory与单元测试更相关。

请参阅请求工厂参考

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

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

建议(可能有偏见):如果您开发一个网站,我建议如下:

  • 侧重于通过测试路径和它们的预期行为进行集成测试;
  • 为业务逻辑添加单元/集成测试(Django中的模型);

使用RequestFactory对部件进行单元测试将花费更多的时间,并且不会带来比使用Client API更多的好处。使用Client API,您将更接近您的网站将如何使用和它的行为。

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48580465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档