2016-02-17 3 views
4

Мне нужно выполнить модульный микшер Django REST. поэтому я пойти на тест, который выглядит следующим образом:Django rest framework unit view viewets mixins

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. 

кажется, что рамки Джанго REST будет иметь некоторые другой подход к модульному тестированию viewsets, mixins и views.
Но я не могу понять, что мне делать вместо этого.
На официальной странице документов предлагается использовать реальные URL-адреса, но это больше подходит для приемочных испытаний, а не для модульных тестов.

+0

Эй @canufeel мне было интересно, вы нашли мой ответ полезным? –

ответ

4

Эта проблема возникает из-за того, что ответ вашего вида не отображается, поэтому _is_rendered is False и исключение 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) 
Смежные вопросы