- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试从使用 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())
长答案:那么RequestFactory
和Client
的区别:有点开发了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
更相关到单元测试。
如果您对单元测试和模拟方法感兴趣,这方面的文献不多,但您可以看看这篇文章(隔离测试 Django View )[ https://matthewdaly.co.uk/blog/2015/08/02/testing-django-views-in-isolation/] .
最终这一切都取决于您有多少时间可以专注于测试。集成/功能/单元测试具有不同的优点和缺点。
建议(可能有偏见):如果您开发网站,我建议如下:
使用 RequestFactory
的单元测试部分将花费您更多时间,并且不会比使用 Client
API 带来更多好处。使用 Client
API,您将更加了解您网站的使用方式和行为方式。
关于python - django RequestFactory 丢失 url kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580465/
我想在 Ubuntu 12.04 的 Springsource Tool Suite 2.9.1 中使用 Spring ROO 1.2.1 + GWT 2.6.1。遵循 http://www.byte
您目前是否将命令模式与 RequestFactory 结合使用?我想使用它,但由于 RequestFactory 不允许继承,我不确定该怎么做。 如果有人遇到过这个问题并找到了实现它的方法,我会很高兴
我正面临 gwt 问题 5794:http://code.google.com/p/google-web-toolkit/issues/detail?id=5794 我看到有一个 8 个月大的补丁,但
我的 GWT 应用程序有十种不同的实体。现在我使用普通的旧 DTO 并通过 GWT-RPC 传输它们。这适用于像启动这样的情况——我可以将它们全部打包到一个请求中。 我正在考虑切换到 RequestF
有没有办法使用 RequestFactory 在单个请求中创建两个实体?我试过: EmployeeRequest request = requestFactory.employeeReques
我需要将 GWT 与基于服务的域层一起使用——而不是使用带有 DAO 的 bean。具有 MVP 和 RequestFactory 的 GWT 2.1 架构是否适合此?还是我应该继续使用 RPC? 谢
你知道我在哪里可以找到新的 GWT 2.1 RequestFactory 的一些代码示例吗?谷歌的教程一开始还不够好。 最佳答案 请检查这个 http://javaasylum.blogspot.co
我想产生以下行为: 用户在浏览器中保存一些实体。在服务器端保存实体后,它会生成通知,并且它必须通过带有更新的实体实例的 Atmosphere 通知所有其他客户端。 所以问题是如何通过Atmospher
我需要一些关于如何最好地使用 GWT 的 RequestFactory 处理将实体的服务器端更改传播到客户端的建议。 让我们假设我们有两个 EntityProxies,一个 PersonProxy 和
您能否告诉我如何让 RequestFactory 填充我的实体代理的字段(这些字段也是实体代理)? 这是父代理 @ProxyFor(value = Organization.class, locato
我尝试创建一个请求,使用 RequestFactory 并使用文件发布,但我没有收到 request.FILES。 from django.test.client import Request
RequestFactory 类中是否有一部分我可以覆盖以提供对某些请求的自动缓存?当然,我可以在 RF 外部进行缓存,但我想通过重写使其完全不可见来实现。 最佳答案 ServiceLayer.inv
我一直在使用 GWT 2.4 开发一个项目,并正在寻找一种方法来验证(JSR 303)我的客户端(代理)类,而无需从我的域类(服务器端)重新创建注释。我知道有一个示例与 GWT 中继代码(验证)一起提
是否可以向 GWT RequestFactory 的代理类添加方法?假设我有这个: @ProxyFor(value = MyEntity.class) interface MyEntityProxy
我正在使用 GWT RequestFactory。当我处于扩展 RemoteServiceServlet 的普通 RPC 类中时,我可以使用 this.getThreadLocalRequest()
有谁知道使用RequestFactory的GWT CellTable示例,并且正在编辑该表?我想列出表中的对象(每一行是一个对象,每一列是一个属性),能够轻松添加新对象并进行编辑。我知道Google的
我正在尝试使用 GWT 和 RequestFactory 构建一个简单的(只读)Web 应用程序,但我不知道如何摆脱以下警告: warning: The domain type DDisplay is
我开始开发一个相当大的GWT项目,它自然有一个数据模型。我想在客户端轻松地使用实体类。 我真的很喜欢吉利德,但是this thread对我来说这不是个好消息。 我不想使用RequestFactory,
在 GWT 应用程序中,我展示了可以由用户编辑的项目。加载和保存项目是使用 GWT 请求工厂执行的。我现在想要实现的是,如果两个用户同时编辑一个项目,则以乐观并发控制的方式先保存的用户获胜。这意味着当
我正在为 requestfactories 和泛型而苦苦挣扎。在下面的代码中,代理方法与实体方法完全匹配,但我得到了日志跟踪: java.lang.NullPointerException: null
我是一名优秀的程序员,十分优秀!