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?
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
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
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