2014-07-23 55 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中,理想情況下可以使用'.prepare()'而不是'.make()'作爲配方,以防止它在數據庫中持久存在對象,但是當你去調用視圖時它們不會顯示出來... –

+0

FactoryBoy不支持創建對象的.build()方法,但它不保存在數據庫中,並且不會設置「id」。您可能能夠創建一些初始數據,這些數據將在創建測試數據庫期間加載,並且每次運行新的測試方法時都不必填充表格(您可以多次使用同一個「人員」對象),但是還沒有找到更好的解決方案 – timop

+0

timop:啊,是的,你說得對。在這種情況下,我正在考慮模型媽媽,並且我弄混了API。感謝您的跟進。 –