estoy teniendo dificultades funciones pitón de prueba que devuelven un iterable, como funciones que son rendimiento o funciones que simplemente devuelven un iterable, como return imap(f, some_iter)
o return permutations([1,2,3])
.Funciones de test que regresan iterable en Python
Así que con el ejemplo de las permutaciones, espero que la salida de la función sea [(1, 2, 3), (1, 3, 2), ...]
. Entonces, empiezo a probar mi código.
def perm3():
return permutations([1,2,3])
# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])
Esto no funcionará, ya que es un perm3()
iterable, no una lista . Entonces podemos arreglar este ejemplo en particular.
def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])
Y esto funciona bien. Pero, ¿y si he anidado iterables? ¿Eso es iterables produciendo iterables? Como decir las expresiones product(permutations([1, 2]), permutations([3, 4]))
. Ahora bien, esto es probablemente no sea útil, pero está claro que será (una vez que se desenrollen los iteradores ) algo así como [((1, 2), (3, 4)), ((1, 2), (4, 3)), ...]
. Sin embargo, no podemos simplemente ajustar list
alrededor de nuestro resultado, ya que solo convertirá iterable<blah>
en [iterable<blah>, iterable<blah>, ...]
. Así por supuesto que puede hacer map(list, product(...))
, pero esto sólo funciona para un nivel de anidamiento 2.
Así que, ¿la comunidad de pruebas de Python tienen ninguna solución para los problemas al probar iterables? Naturalmente, algunos iterables no pueden probarse de esta manera, como si usted quiere un generador infinito, pero todavía este problema debería ser lo suficientemente común como para que alguien haya pensado acerca de esto.
Aceptaré esto porque es tan bueno como la respuesta de dbw. A diferencia de mi respuesta, puedes mezclar 'tuples' /' lists'. Esta respuesta también es solo copiar y pegar ejecutable. :) ¡Pero! Estaría más satisfecho si hubiera una respuesta donde (1) realmente compruebe que devuelve un iterable (cambie 'permutaciones de retorno ([1,2,3])' a 'lista de retorno (permutaciones ([1,2,3 ])) 'no debe pasar ** y ** (2) el valor esperado anidado debe tener tipos correctos. Eso es cambiar una de las tuplas a una lista no debe pasar (cambiar' (2, 3, 1) 'a' [2, 3, 1] '). – Tarrasch
Ah. Es suficiente. Supongo que generalmente evito los tipos de prueba y trato de probar las interfaces en su lugar. Esto permite que los detalles de implementación cambien de alguna manera, mientras se siguen produciendo los mismos datos/resultados. . – dbn