2017-08-04 130 views
0

我試圖嘲弄鏈式Django的模型對象在以下假設法,如何模擬一個Django模型對象(及其方法)?

# utils.py 
def foo_something_exist(): 
    if Foo.objects.get(a='something').exist(): 
     return 'exist' 



# test.py 
import unittest.mock import patch 

import utils 

. 
. 
. 
@patch('utils.Foo') 
def test_foo_something_exist_returns_none(self, mock_foo): 
    mock_foo.objects.get.exists.return_value = False 
    self.assertIsNone(utils.foo_something_exist()) 
. 
. 
. 

test_foo_something_exist()未能通過測試。我發現utils.py中的Foo.objects.get(a='something').exist()是MagicMock對象(<MagicMock name='Member.objects.get().exists()' id='xxxxxx'>)而不是False,這導致了此測試功能的失敗。是的,我也試過mock_foo.objects.return_value.get.return_value.exists.return_value = False,這是在一篇文章中提到的。正確地模擬模型對象(使用鏈式方法)的指針/提示值得欣賞。

預先感謝您。

回答

1

不修補模型本身,而是model.objects然後嘲笑鏈的每一個部分:

@patch('utils.Foo.objects') 
def test_foo_something_exist_returns_none(self, mock_foo): 
    # just to show how to do it with longer chains 
    # mock_foo.filter.return_value = mock_foo 
    # mock_foo.exclude.return_value = mock_foo    
    mock_foo.get.return_value = mock_foo 
    mock_foo.exists.return_value = False 

    self.assertIsNone(utils.foo_something_exist()) 

這也工作與.filter().exclude()和其他模型操作。在測試Django模型時,我也發現Model Mommy真的很有用。

+0

謝謝你的回答。我可以知道'mock_foo.get.return_value = mock_foo'是做什麼的嗎? – tebesfinwo

+0

它使用修補後的對象作爲每個鏈接方法調用的返回值。所以你最終得到一個有方法的補丁對象,並且它們都返回相同的補丁對象。這種方式也無關緊要你鏈接方法調用的順序。 – masterfloda

相關問題