2017-01-10 112 views
0

我最近開始研究Django項目。首先,我閱讀book on TDD with Python和官方文檔(tests)。還有更多的博客。Django - 用mocks編寫單元測試

我注意到的一件事是,他們編寫測試訪問數據庫模型。考慮從here

def test_home_page_can_save_a_POST_request(self): 
    request = HttpRequest() 
    request.method = 'POST' 
    request.POST['item_text'] = 'A new list item' 

    response = home_page(request) 

    self.assertEqual(Item.objects.count(), 1) 
    new_item = Item.objects.first() 
    self.assertEqual(new_item.text, 'A new list item') 

下面的代碼片段的測試斷言Item對象的數量是否爲1。因此測試實際上增加了,並從數據庫中檢索數據。這不會讓測試變慢嗎?

如果測試是並行化的,如果還有其他測試會添加一個Item對象,那麼測試用例可能會失敗,對嗎?

修補方法/對象如何?上面的代碼片段可以重構像這樣

@patch('my_app.views.Item') 
def test_home_page_can_save_a_POST_request(self, mock_item): 
    request = HttpRequest() 
    request.method = POST 
    request.POST['item_text'] = 'A new list item' 

    response = home_page(request) 

    self.assertTrue(mock_item.objects.create.called) 

我是Django的新手,我不熟悉這些實踐。我訪問的教程寫了與數據庫交談的測試。我想知道,這是否是在Django項目中測試的慣例。第二個片段(使用補丁和模擬)在Django生態系統中完美無瑕嗎?

編輯:與形式相同 - 模擬form.is_valid返回方法TrueFalse,前提是表單有單獨的單元測試。

P.S.使用Python進行TDD是一本非常棒的書,幫助我在入門時獲得了極大的擴展。我絕對推薦給任何學習Django的人。

+0

測試在他們自己的事務中運行,因此只要可用/預期的數據相互獨立。 (感謝這本書的指針 - 看起來很棒!) –

回答

1

如果你想測試你的模型,你幾乎不能繞過數據庫,而且事實上,它可以使測試有點慢,即使使用內存中的SQLite數據庫 - 這可能會導致其他問題FWIW,因爲SQLite是不是像PostgreSQL這樣的透明替代品。

但是,假設你在視圖中調用的任何模型或其他函數/對象/方法都有自己的單元測試,並且你只想檢查你的視圖做預期的調用,嘲笑是可行的策略 - 實際上可能比測試結果預期的調用(主要將您的單元測試轉換爲集成測試)。

+0

我相信'Forms'也是如此。我可以模擬'form.is_valid'返回'True'或'False'並測試我的SUT。當然,在爲Forms編寫單元測試之後。 – shar