2012-05-11 14 views
6

Ich habe folgendes Szenario:Mocking Django Modell und speichern()

in meinem models.py

class FooBar(models.Model): 
    description = models.CharField(max_length=20) 

in meiner utils.py Datei.

from models import FooBar 

def save_foobar(value): 
    '''acts like a helper method that does a bunch of stuff, but creates a 
    FooBar object and saves it''' 

    f = FooBar(description=value) 
    f.save() 

in tests.py

from utils import save_foobar 

@patch('utils.FooBar') 
def test_save_foobar(self, mock_foobar_class): 

    save_mock = Mock(return_value=None) 
    mock_foobar_class.save = save_mock 

    save_foobar('some value') 

    #make sure class was created 
    self.assertEqual(mock_foobar_class.call_count, 1) #this passes!!! 

    #now make sure save was called once 
    self.assertEqual(save_mock.call_count, 1) #this fails with 0 != 1 !!! 

Dies ist eine vereinfachte Version von dem, was ich ... so zu tun, ich versuche bitte nicht hungup, warum ich habe eine utils-Datei und eine Hilfsfunktion dafür (im wirklichen Leben macht es mehrere Dinge). Bitte beachten Sie auch, dass dies ein vereinfachtes Beispiel für mein Problem ist. Der erste Aufruf von call_count gibt 1 zurück und wird übergeben. Der zweite gibt jedoch 0 zurück. Es scheint also, als ob mein Patch funktioniert und aufgerufen wird.

Wie kann ich testen, dass nicht nur eine Instanz von FooBar erstellt wird, sondern auch, dass die Save-Methode aufgerufen wird?

Antwort

7

Hier ist Ihr Problem, Sie haben derzeit:

mock_foobar_class.save = save_mock 

seit mock_foobar_class ist ein verspottet Klassenobjekt und die save Methode basiert auf einer Instanz dieser Klasse (nicht die Klasse selbst) genannt, müssen Sie assert, dass save für den Rückgabewert der Klasse (auch Instanz genannt) aufgerufen wird.

Versuchen Sie folgendes:

mock_foobar_class.return_value.save = save_mock 

Ich hoffe, das hilft!

+2

Sie haben mich auf die Antwort geschlagen! – fuzzyman

+0

Upvote zum Antworten auf meine Anfrage! Vielen Dank! –

+0

@matthew! Vielen Dank! –

Verwandte Themen