2014-07-23 23 views
9

Veritabanı modelimi Django-rest-framework görünüm kümelerini ve yönlendiricileri kullanarak açığa çıkardım ve bunun için birim sınamalarını yazmaya çalışıyorum. İşte Django-rest-framework api'nin birim testleri nasıl yazılır?

benim API ve test kodu

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 

Birim-testler

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) 

I istemiyorum veritabanına bağlanmak ünite testleri için entegrasyon testleri altındadır.

Veritabanıyla dalga geçmenin bir yolu var mı? Standart görünüm işlevleri için alaylamayı nasıl uygulayacağımı biliyorum ama burada alay çalışmıyor.

  1. REST-API'm için birim sınamaları nasıl yazılır?
  2. Veritabanım birim testlerimde nasıl takılır?
+0

Bu projeye aşina değilim, bu yüzden size orada özellikle yardımcı olamıyorum, ancak hangi sınıfa/işlevin gerçekten veritabanına bağlandığını ve testlerinizde olduğunu anlayabilmek için belgelere bakın. –

+1

Eğer API'yi test etmek isterseniz, hiç bir birim testi kullanamazsınız. API'yi test etmek, görünümü çağırmak ve test veritabanından iyi biçimlendirilmiş verileri almak anlamına gelir. Bu yazdığınız gibi bir entegrasyon testi olurdu. Ünite ve entegrasyon testleri arasındaki fark sadece veritabanına dokunmakla kalmamakta. – Norman8054

cevap

2

manage.py test'u çalıştırdığınızda, veritabanınızın tabanı oluşturulur ancak veri içermez. sadece gerekli nesneleri kendiniz oluşturabilir veya yeni bir başlatırken Sadece veritabanı önceki test yöntemlerinin veri temizlenir unutmayın FactoryBoy

gibi bir şey kullanabilirsiniz Bunu yapmak için.

+1

Veritabanının kullanımını nasıl önleyebileceğini merak ediyorum. FactoryBoy'da ".make()' yerine ".make()' gibi bir şeyleri ideal olarak kullanarak veritabanındaki nesneleri kalıcı hale getirmesini engelleyebilirsiniz, ancak sonra görünümü çağırdığınızda görünmeyeceklerdir. ... –

+0

FactoryBoy, nesneyi oluşturan, ancak veritabanında saklanmayan ve bir 'id' kümesine sahip olmayacak olan .build() yöntemini destekler. Test veritabanı oluşturma sırasında yüklenecek bazı başlangıç ​​verilerini yapabiliyor olabilirsiniz ve yeni bir test yöntemi çalıştırdığınızda tabloları doldurmak zorunda kalmayacaksınız (aynı 'kişi' nesnesini birden çok kez kullanabilirsiniz) ancak Daha iyi bir çözüm bulamadınız – timop

+0

timop: Ah evet, haklısınız. Bu örnekte model annemi düşünüyordum ve API'ları karıştırdım. Takip için teşekkürler. –

İlgili konular