2012-04-12 10 views
5

Tengo un conjunto de pruebas (usando nose, not unittest), y quiero parchar una función para devolver una secuencia específica de valores para cada prueba en la clase de prueba. Mi primer intento, utilizando un ejemplo simplificado, era:Parcheando una función usando Mock

@patch('time.clock', MagicMock(side_effects=[1, 2])) 
class Tests: 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Sin embargo, la instancia MagicMock se creará una vez solamente, por lo que la segunda prueba falla cuando los efectos secundarios se agoten. Puedo parchar cada método de prueba por separado, pero realmente no quiero duplicar el decorador de parches sobre todos ellos (¡hay muchas más pruebas que en este ejemplo!) La otra forma en que podría hacerlo es crear el parche en el código de configuración como esta:

class Tests: 
    def setup(self): 
     self.old_clock = time.clock 
     time.clock = MagicMock(side_effects=[1, 2]) 

    def teardown(self): 
     time.clock = self.old_clock 

    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

Pero guardar y restaurar la función original definición parece como algo que Mock debería ser capaz de hacerlo automáticamente. ¿Hay algún otro método para hacer esto que me falta? ¿O es mi último ejemplo la mejor manera de hacer esto?

Respuesta

2
a = (x for x in [1,2]) 

x = lambda : next(a) 

x() 

de salida: 1

x() 

de salida: 2

Ponga sus respuestas en la lista de un. Cambie X por el nombre que desee.

+0

no tengo idea de lo que está recibiendo en aquí. No parece relacionar la pregunta en absoluto, y parece una forma complicada de escribir 'x = [1, 2] .__ iter __(). Next'. ¿Qué estás tratando de decir? – aquavitae

+0

bien. Quieres una forma de crear una función falsa. Ahora tienes el orden de las respuestas. ¿No? x = ["Su primera respuesta", "Su segunda respo", "... etc"] .__ iter __(). Siguiente Resuelve el problema. – Nasgar

+0

Sé cómo crear un iterador y simular una función. Mi pregunta era si hay una manera fácil de restablecer el simulacro para cada función de prueba. – aquavitae

1

Usted sólo debe aplicar el parche en cada prueba, en lugar de aplicarlo a la clase:

class Tests: 
    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_1(self): 
     assert time.clock() == 1 
     assert time.clock() == 2 

    @patch('time.clock', MagicMock(side_effects=[1, 2])) 
    def test_2(self): 
     assert time.clock() == 1 
     assert time.clock() == 2