2017-08-04 4 views
0

Ich versuche, ein verkettete Django Modellobjekt in der folgenden Dummy-Methode zu verspotten, nichtWie spottet man ein Django-Modellobjekt (zusammen mit seinen Methoden)?

# 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() den Test. Ich entdeckte, dass Foo.objects.get(a='something').exist() in utils.py ein MagicMock-Objekt (<MagicMock name='Member.objects.get().exists()' id='xxxxxx'>) anstelle von False war, die zum Versagen dieser Testfunktion beigetragen haben. Und ja, ich habe auch versucht mock_foo.objects.return_value.get.return_value.exists.return_value = False, die in einem Post erwähnt wurde. Pointer/Hinweise, um ein Modellobjekt (mit seinen verketteten Methoden) richtig zu verspotten, ist zu schätzen.

Vielen Dank im Voraus.

Antwort

1

Sie patchen das Modell nicht selbst, sondern model.objects und dann jeden Teil der Kette verspotten:

@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()) 

Dies auch mit der Arbeit .filter(), .exclude() und anderen Modell-Operationen. Ich finde auch Model Mommy wirklich hilfreich beim Testen von Django-Modellen.

+0

Vielen Dank für Ihre Antwort. Darf ich wissen, was 'mock_foo.get.return_value = mock_foo' macht? – tebesfinwo

+0

wird das gepatchte Objekt als Rückgabewert für jeden verketteten Methodenaufruf verwendet. Sie haben also ein gepatchtes Objekt mit den Methoden, und alle geben dasselbe gepatchte Objekt zurück. Auf diese Weise ist es auch egal in welcher Reihenfolge Sie die Methode aufrufen. – masterfloda

Verwandte Themen