Estoy escribiendo algunos casos de prueba para mi aplicación usando Python's unittest
. Ahora necesito comparar una lista de objetos con una lista de otros objetos para verificar si los objetos de la primera lista son los que estoy esperando.Cómo escribir un método `.assertFoo()` personalizado en Python?
¿Cómo puedo escribir un método personalizado .assertFoo()
? ¿Qué debería hacer? ¿Debería plantear una excepción en caso de error? Si es así, ¿qué excepción? ¿Y cómo pasar el mensaje de error? ¿Debería el mensaje de error ser una cadena unicode o una cadena de bytes?
Desafortunadamente, el official documentation no explica cómo escribir métodos de aserción personalizados.
Si necesita un ejemplo del mundo real para esto, continúe leyendo.
El código que estoy escribiendo es algo como esto:
def assert_object_list(self, objs, expected):
for index, (item, values) in enumerate(zip(objs, expected)):
self.assertEqual(
item.foo, values[0],
'Item {0}: {1} != {2}'.format(index, item.foo, values[0])
)
self.assertEqual(
item.bar, values[1],
'Item {0}: {1} != {2}'.format(index, item.bar, values[1])
)
def test_foobar(self):
objs = [...] # Some processing here
expected = [
# Expected values for ".foo" and ".bar" for each object
(1, 'something'),
(2, 'nothing'),
]
self.assert_object_list(objs, expected)
Este enfoque hace que sea extremadamente fácil de describir los valores esperados de cada objeto en una forma muy compacta, y sin necesidad de realidad crear objetos completos
Sin embargo ... Cuando un objeto falla la aserción, no se comparan más objetos, y esto hace que la depuración sea un poco más difícil. Me gustaría escribir un método personalizado que compare incondicionalmente todos los objetos, y luego mostraría todos los objetos que fallaron, en lugar de solo el primero.
Buen enfoque alternativo para la creación de subclases: esto fue útil. –
Este enfoque también se llama [mixin] (https://en.wikipedia.org/wiki/Mixin#In_Python). –
@ DenilsonSáMaia - ¿Está bien hacer que una declaración personalizada devuelva algo? –