2014-07-23 5 views
9

Django-rest-framework 뷰 세트와 라우터를 사용하여 데이터베이스 모델을 공개했습니다. 단위 테스트를 작성하려고합니다. 여기 Django-rest-framework API의 단위 테스트를 작성하는 방법은 무엇입니까?

내 API 및 테스트 코드

Viewsets.py

class Model1ViewSet(viewsets.ReadOnlyModelViewSet): 

    model = Model1 
    serializer_class = Model1Serializer 
    filter_class = Model1Filter 
    filter_backends = (filters.DjangoFilterBackend, filters.OrderingFilter) 
    ordering = ('id', 'cl1') 

Serializer.py

class Model1Serializer(serializers.HyperlinkedModelSerializer): 
    chip = serializers.HyperlinkedRelatedField(view_name="some-detail") 

    class Meta: 
     model = Model1 
     fields = ('url', 'id', 'cl1', 'cl2', 'cl3', 'cl4') 
     depth = 1 

단위 - 테스트

from rest_framework.test import APIClient 

class TestModel1Api(unittest.TestCase): 

    def setUp(self): 
     self.client = APIClient() 

    def test_Model1_list(self): 
     response = self.client.get(reverse('Model1-list')) 
     self.assertEqual(response.status_code, status.HTTP_200_OK) 

    def test_Model1_detail(self): 
     mm_objs = Model1.objects.all() 
     if mm_objs: 
      response = self.client.get(reverse('Model1-detail', args=[mm_objs[0].id])) 
      self.assertEqual(response.status_code, status.HTTP_200_OK) 

있습니다 내가 원하지 않는 데이터베이스에 연결하기 단위 테스트의 경우 통합 테스트에 해당하므로

데이터베이스를 조롱하는 방법이 있습니까? 표준보기 기능을 위해 조롱을 적용하는 방법을 알고 있지만 여기 조롱은 작동하지 않습니다.

  1. 내 REST-API에 대한 단위 테스트를 작성하는 방법은 무엇입니까?
  2. 단위 테스트에서 데이터베이스를 조롱하는 방법은 무엇입니까?
+0

저는이 프로젝트에 익숙하지 않아 특별히 당신을 도울 수는 없지만 문서에서 어떤 클래스/기능이 실제로 데이터베이스에 연결되어 있는지 테스트 해보십시오. –

+1

API를 테스트하려면 단위 테스트를 전혀 사용할 수 없습니다. API 테스트는 뷰를 호출하고 테스트 데이터베이스에서 올바른 형식의 데이터를받는 것을 의미합니다. 당신이 쓴대로 이것이 통합 테스트 일 것입니다. 단위 테스트와 통합 테스트의 차이점은 데이터베이스를 만지는 것만이 아니라는 것입니다. – Norman8054

답변

2

manage.py test을 실행하면 데이터베이스의베이스가 만들어 지지만 데이터가 없습니다. 이를 수행하기 위해 필요한 객체를 직접 만들거나 다음과 같은 것을 사용할 수 있습니다. FactoryBoy

새 테스트를 시작할 때 이전 테스트 방법의 데이터는 데이터베이스에서 지워집니다.

+1

나는 어떻게 데이터베이스의 사용을 피할 수 있는지 궁금하다. FactoryBoy에서는 recipe가 데이터베이스에 객체를 유지하지 못하도록하기 위해'.make()'대신'.prepare()'와 같은 것을 사용할 수 있지만 뷰를 호출 할 때 표시되지 않습니다. ... –

+0

FactoryBoy는 객체를 생성하는 .build() 메소드를 지원하지만 데이터베이스에 저장되지 않고 'id'가 설정되지 않습니다. 테스트 데이터베이스를 생성하는 동안로드되는 초기 데이터를 만들 수 있으며 새 테스트 메소드를 실행할 때마다 테이블을 채울 필요가 없습니다 (동일한 '사람'개체를 여러 번 사용할 수는 있지만) 더 나은 해결책을 찾지 못했습니다. – timop

+0

timop : 아 맞습니다. 나는이 경우에 모델 엄마를 생각하고 API가 섞여있다. 후속 감사. –

관련 문제