gpt4 book ai didi

python - django RequestFactory 丢失 url kwargs

转载 作者:太空狗 更新时间:2023-10-30 00:47:35 26 4
gpt4 key购买 nike

我正在尝试从使用 Django Test Client 切换到 RequestFactory 以加快我的测试速度。但是,由 RequestFactory 生成的请求不会为 View 提供正确的 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,它有什么意义呢?还是有办法以某种方式将它们放入 View 中?

最佳答案

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

您的回答有两个方面。

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

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,只构建一个请求对象,将添加适当属性和调用适当 View 函数或 View 方法的责任留给用户。

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

测试方面,Client 专注于集成测试(您将测试所有不同的部分是否组合在一起:中间件、类-based/function view, template, templatetags),这是你在这里测试的端到端机制。

客户端 -> { UrlResolver -> 中间件 -> View -> 中间件 -> TemplateResponse } -> 测试

使用 RequestFactory 您可以专注于测试较小的部分、基于类的 View 方法、函数 View 、中间件方法等。从这个意义上说,RequestFactory 更相关到单元测试

参见 Request Factory Reference

如果您对单元测试和模拟方法感兴趣,这方面的文献不多,但您可以看看这篇文章(隔离测试 Django View )[ https://matthewdaly.co.uk/blog/2015/08/02/testing-django-views-in-isolation/] .

最终这一切都取决于您有多少时间可以专注于测试。集成/功能/单元测试具有不同的优点和缺点。

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

  • 通过测试路由及其预期行为专注于集成测试;
  • 为您的业务逻辑(Django 中的模型)添加单元/集成测试;

使用 RequestFactory 的单元测试部分将花费您更多时间,并且不会比使用 Client API 带来更多好处。使用 Client API,您将更加了解您网站的使用方式和行为方式。

关于python - django RequestFactory 丢失 url kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com