DRF测试:返回OrderedDict而不是JSON

ZvL*_*ZvL 19 django rest json django-rest-framework

我正在尝试为Django Rest Framework实现测试.我的大多数测试都通过并且设置assertEqual得很顺利,但我现在遇到一个问题,因为它一直在比较JSON和OrderedDict.

我不知道OrderedDict来自哪里,因为DRF 应该只返回JSON(对吧?).

测试环境可能在比较之前解析JSON吗?那会很糟糕.

我正在进行集成测试,只测试GET请求对某个资源的响应中的数据,我是基于JSON装置做的.我没有测试REST框架的特定组件,因为我的组件实现非常简单,它们已经通过DRF项目中的测试进行了测试.

无论如何,我希望有人可以帮助我!

All*_*man 9

正如解释在这里,这是因为在测试过程中对请求的默认格式是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)

自动修复所有测试.


Nor*_*rgg 6

听起来您正在使用 response.data (它返回解析的 json 对象)而不是 response.content (它提供原始 json 字符串)。

http://www.django-rest-framework.org/api-guide/testing/#testing-responses


eln*_*ren 5

如果您的测试如下所示:

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 调用,专注于测试您的逻辑和正确的路由/视图/序列化器/等。正在使用。