【问题标题】:Django rest framework unit test viewsets mixinsDjango rest 框架单元测试视图集 mixins
【发布时间】:2016-05-29 02:16:07
【问题描述】:

我需要对 Django REST 框架 mixin 进行单元测试。所以我去做一个看起来像这样的测试:

class TestMyMixin(APITestCase):

    class DummyView(MyMixin,
        viewsets.ModelViewSet):
        queryset = MyModel.objects.all()
        serializer_class = MyModelSerializer

        #some properties omitted

    def setUp(self):
        self.view = self.DummyView.as_view(\
            actions={'get':'list'})

    def test_basic_query(self):
        instance = MyModel.objects.create(\
            **{'name':'alex'})
        request = APIRequestFactory().get(\
            '/fake-path?query=ale',
            content_type='application/json')
        response = self.view(request)
        self.assertEqual(\
            response.status_code,status.HTTP_200_OK)
        json_dict = json.loads(\
            response.content.decode('utf-8'))
        self.assertEqual(json_dict['name'],instance.name)

但是,当我运行此测试时,我确实得到了:

raise ContentNotRenderedError('The response content must be 'django.template.response.ContentNotRenderedError: The response content must be rendered before it can be accessed.

django REST framework 似乎有一些不同的单元测试方法viewsetsmixinsviews
但我不知道我应该做什么。
官方文档页面建议使用真实的 url,但它更适合验收测试而不是单元测试。

【问题讨论】:

  • 嘿@canufeel 我想知道,你觉得我的回答有帮助吗?

标签: python django unit-testing django-rest-framework


【解决方案1】:

出现此问题是因为您的视图的响应没有得到呈现,因此 _is_renderedFalse 并且引发了 ContentNotRenderedError 异常。

您可以在django.template.response 源代码中了解发生这种情况的原因和方式。

您可以通过在回复中手动调用.render() 来解决该问题:

response = self.view(request)
self.assertEqual(response.status_code, status.HTTP_200_OK)

# Render the response manually
response.render()
json_dict = json.loads(response.content.decode('utf-8'))
self.assertEqual(json_dict['name'],instance.name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2015-04-19
    • 1970-01-01
    • 2017-02-13
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多