Tengo una clase Python TestCase
donde todos los métodos de prueba, excepto uno, necesitan parchear un objeto de la misma manera. El otro método necesita algún otro comportamiento del mismo objeto. Estoy usando mock, así que lo hice:Anulación del decodificador de parches de Python Mock
@mock.patch('method_to_patch', mock.Mock(return_value=1))
class Tests(TestCase):
@mock.patch('method_to_patch', mock.Mock(return_value=2))
def test_override(self):
(....)
Pero eso no funciona. Cuando se ejecuta test_override
, aún llama al comportamiento parchado del decorador de clases.
Después de una gran cantidad de depuración, descubrí que durante el TestSuite
acumulación, la @patch
alrededor test_override
se está llamando antes de la una alrededor de Tests
, y desde mock
aplicar los parches en orden, el decorador de clase es reemplazar el método decorador.
¿Es correcto este pedido? Esperaba lo contrario y no estoy seguro de cómo anular el parche ... ¿Quizás con una declaración with
?
¿Es necesario que 'test_override' esté en' Tests'? Me puedo imaginar tener otro 'TestCase' que para' test_override' y pruebas similares. Si quieres que 'method_to_patch' haga una cosa diferente a' test_override', entonces también puedo imaginar que está justificado tener otra clase 'TestCase'. Eso también resolvería su problema y hace que el código sea mucho más legible para otros desarrolladores (en comparación con el "parcheo de parches"). –
@SimeonVisser Mover 'test_override' a otra clase no es realmente una opción, debido a las reglas que usamos para estructurar las pruebas. Son todas las pruebas relativas a la misma vista, por lo que las ponemos en un solo 'TestCase' – Gabe