2012-05-11 25 views
6

tengo el siguiente escenario:que imita Django modelo y save()

en mi models.py

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

en mi archivo utils.py.

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

en 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 !!! 

Ésta es una versión simplificada de lo que estoy tratando de hacer ... así que por favor no te hungup sobre por qué tengo un archivo de utilidades y una función auxiliar para esto (en la vida real hace varias cosas). Además, tenga en cuenta que, aunque simplificado, este es un ejemplo real de mi problema. La primera llamada para probar call_count devuelve 1 y pasa. Sin embargo, el segundo devuelve 0. Por lo tanto, parece que mi parche está funcionando y recibiendo una llamada.

¿Cómo puedo comprobar que no solo se crea una instancia de FooBar, sino también que se llama al método de salvar?

Respuesta

7

Aquí es su problema, que actualmente tiene:

mock_foobar_class.save = save_mock 

desde mock_foobar_class es un objeto de clase burlado, y el método save se llama en una instancia de esa clase (no la clase en sí), es necesario afirmar que se llama a guardar en el valor de retorno de la clase (también conocido como la instancia).

Prueba esto:

mock_foobar_class.return_value.save = save_mock 

espero que ayude!

+2

¡Me ganas con la respuesta! – fuzzyman

+0

Votación a favor para responder a mi consulta! ¡Muchas gracias! –

+0

@matthew! ¡Muchas gracias! –

Cuestiones relacionadas