Tengo una clase que está destinada a generar una contraseña aleatoria de una longitud que también es aleatoria, pero limitada a estar entre una longitud mínima y máxima definida.
Estoy construyendo pruebas unitarias, y me encontré con un pequeño inconveniente interesante con esta clase. Toda la idea detrás de una prueba unitaria es que debe ser repetible. Si ejecuta la prueba cien veces, debería dar los mismos resultados cien veces. Si depende de algún recurso que puede o no estar allí o puede estar o no en el estado inicial que espera, entonces debe burlarse del recurso en cuestión para asegurarse de que su prueba siempre sea repetible.
Pero ¿qué pasa en los casos en que se supone que el SUT genera una salida indeterminada?
Si arreglo la longitud mínima y máxima al mismo valor, entonces puedo verificar fácilmente que la contraseña generada tenga la longitud esperada. Pero si especifico un rango de longitudes aceptables (digamos 15-20 caracteres), ahora tiene el problema de que podría ejecutar la prueba cientos de veces y obtener 100 pases, pero en la ejecución 101 podría recuperar una cadena de 9 caracteres.
En el caso de la clase de contraseña, que es bastante simple en su núcleo, no debería ser un gran problema. Pero me hizo pensar en el caso general. ¿Cuál es la estrategia que generalmente se acepta como la mejor opción cuando se trata de SUT que generan resultados indeterminados por diseño?