2012-01-20 11 views
11

Estoy tratando de usar el parche para devolver el simulacro dentro de un método. La estructura básica es la siguiente:El parche falso no funciona con la clase en __init__.py

MyCode.py 

class MyClass: 

    def __init__(self, first_name, last_name): 
     self.first = first_name 
     self.last = last_name 

    def get_greeting(self): 
     return 'Hello {f} {l}'.format(f=self.first, l=self.last) 


def get_new_greeting(first_name, last_name): 
    obj = MyClass(first_name, last_name) 
    return obj.get_greeting() 


my_code_test.py 

import unittest 
from mock import Mock, patch 
import my_code 

class TestMyCode(unittest.TestCase): 
    def setUp(self): 
     pass 

    @patch('my_code.MyClass') 
    def test_get_greeting(self, MockClass): 
     instance = MockClass.return_value 
     mock_greeting = 'Hello Me' 
     instance.get_greeting.return_value = mock_greeting 

     greeting = my_code.get_new_greeting('john', 'doe') 
     self.assertEqual(greeting, mock_greeting) 


if __name__ == '__main__': 
    unittest.main() 

El código anterior funciona bien para mí. Sin embargo, cuando aplico el mismo patrón al código real que intento probar, el objeto real (no el simulacro) se devuelve en el método que se prueba. No puedo ver ninguna diferencia El único pensamiento que es un poco diferente es que la clase real se define en un archivo init .py. No estoy seguro si esto hace la diferencia o no? ¿Alguien ha visto esto antes?

Nota: la lib real es Twilio 3.3.5 y estoy usando Python y Django 2.6.5 1.3.1 y 0.7.2 Mock

+1

Probablemente necesite publicar el código que no está funcionando, en lugar del código que está. –

+0

@DanielRoseman punto muy válido. La razón por la que utilicé este enfoque fue porque pensé que muy pocas personas tendrían el paquete Twilio y que quizás no quieran instalarlo (aunque esto no es un gran problema si está usando virtualenv), y quería mostrar que entendía el principio básico de lo que necesitaba hacer. Gracias por su respuesta. –

Respuesta

11

lo he descubierto. No tenía nada que ver con el archivo __init__.py. Fue (como siempre) mi culpa! :)

Sólo para cualquier persona que es cada tratando de usar Mock y el parche con Twilio y SMS en el futuro, aquí está la solución:

me estaba burlando de la clase twilio.rest.TwilioRestClient embargo, las cosas están encadenados juntos y necesitaba llamar al parche en la clase interna llamada SmsMessage. Por lo tanto, para mi prueba de unidad, esto funciona así:

@patch('twilio.rest.resources.SmsMessages') 
def test_send_msg_valid_args(self, MockClass): 
    instance = MockClass.return_value 
    instance.create.return_value = None 
    to_number = '+15555555555' 
    msg = 'Hello world' 
    send_sms(to_number, msg) 

    instance.create.assert_called_once_with(to=to_number, body=msg, from_=default_from_number) 

nota: Send_SMS es realmente la función que estoy tratando de probar. Solo quería asegurarme de que estaba llamando a twilio como se esperaba y de proporcionar el default_from_number. El valor default_from_number se define en el archivo de configuración y no es realmente importante para este ejemplo.

Cuestiones relacionadas