ZvL*_*ZvL 19 django rest json django-rest-framework
我正在尝试为Django Rest Framework实现测试.我的大多数测试都通过并且设置assertEqual得很顺利,但我现在遇到一个问题,因为它一直在比较JSON和OrderedDict.
我不知道OrderedDict来自哪里,因为DRF 应该只返回JSON(对吧?).
测试环境可能在比较之前解析JSON吗?那会很糟糕.
我正在进行集成测试,只测试GET请求对某个资源的响应中的数据,我是基于JSON装置做的.我没有测试REST框架的特定组件,因为我的组件实现非常简单,它们已经通过DRF项目中的测试进行了测试.
无论如何,我希望有人可以帮助我!
正如解释在这里,这是因为在测试过程中对请求的默认格式是multipart不是json.您可以通过将其提供给api调用来指定格式,如下所示:
response = self.client.get('/something/1', format='json')
Run Code Online (Sandbox Code Playgroud)
或者你可以在你的settings.py喜欢中设置默认的测试请求格式:
REST_FRAMEWORK = {
'TEST_REQUEST_DEFAULT_FORMAT': 'json', # Use application/json instead of multipart/form-data requests in tests.
}
Run Code Online (Sandbox Code Playgroud)
自动修复所有测试.
听起来您正在使用 response.data (它返回解析的 json 对象)而不是 response.content (它提供原始 json 字符串)。
见http://www.django-rest-framework.org/api-guide/testing/#testing-responses
如果您的测试如下所示:
class SomeTests(APITestCase):
def test_something(self):
response = self.client.get('/something/1')
# assertions with response
Run Code Online (Sandbox Code Playgroud)
那么响应肯定是 OrderedDict 而不是 JSON 文档。幸运的是,Django 1.9 引入了该response.json()方法(https://docs.djangoproject.com/en/1.9/topics/testing/tools/#django.test.Response.json),因此您可以轻松地将响应转换为 JSON。请注意,您也可以使用 python 的json库。
这里的问题是 Django 的测试客户端(DRF 扩展)是一个“虚拟浏览器”(https://docs.djangoproject.com/en/1.9/topics/testing/tools/#the-test-client)并且不它的工作方式与 Selenium 等浏览器内框架完全一样。因此,HTTP 调用实际上只是模拟的 HTTP 调用,专注于测试您的逻辑和正确的路由/视图/序列化器/等。正在使用。