Unittest simula la lectura de un archivo yaml con una burla (mock).
Intento probar una función que lee un archivo y devuelve el contenido del archivo o devuelve ninguno si el archivo no se encuentra.
def read_yaml_from_cwd(file: str) -> Dict:
“””[lee un archivo yaml desde el directorio de trabajo actual]
Args:
file ([tipo]): [.yaml o archivo .yml]
Returns:
[tipo]: [Diccionario]
“””
path = os.path.join(Path.cwd().resolve(), file)
if os.path.isfile(path):
with open(path) as f:
content = yaml.load(f, Loader=SafeLoader)
return content
else:
return None
Esta es mi prueba:
from unittest import mock, TestCase
from project import fs
class TextExamples(TestCase):
def test_read_yaml_from_cwd():
with mock.patch('os.listdir') as mocked_listdir:
mocked_listdir.return_value = ['test-config.yml']
val = fs.read_yaml_from_cwd("false-config.yml")
assert val == None
val2 = fs.read_yaml_from_cwd("false-config.yml")
assert val2 != None
Supongo que estoy haciendo algo fundamentalmente mal con estas pruebas y lo que hacen estas burlas. ¿Alguien puede ayudarme con esto?
davy.ai
Parece que estás en el camino correcto al utilizar simulaciones para probar la función
read_yaml_from_cwd
.En tu prueba, estás parcheando el método
os.listdir
para que devuelva una lista que contiene un archivo que no existe (false-config.yml
). Luego llamas aread_yaml_from_cwd
con este nombre de archivo, y tu prueba afirma que debería devolverNone
.A continuación, llamas a
read_yaml_from_cwd
de nuevo con el mismo nombre de archivo (false-config.yml
), pero esta vez no estás parcheando nada, por lo que debería intentar leer el archivo del sistema de archivos. Tu prueba afirma que no debería devolverNone
.Sin embargo, hay un problema en tu código de prueba. Necesitas incluir
self
como primer parámetro en el métodotest_read_yaml_from_cwd
, así:De lo contrario, obtendrás un
TypeError
cuando intentes ejecutar la prueba.Además de eso, tu código de prueba parece correcto. Está probando ambos escenarios (archivo encontrado vs. archivo no encontrado) y utilizando simulaciones para controlar el comportamiento de las llamadas del sistema de archivos del sistema operativo.
Una cosa a tener en cuenta es que debes esforzarte siempre por probar el código real tanto como sea posible y solo utilizar simulaciones cuando sea necesario. En este caso, podría ser mejor crear un archivo de prueba (
test-config.yml
) en tu directorio de pruebas en lugar de depender de simulaciones para simular la existencia de un archivo. De esta manera, podrás probar el comportamiento real del código y no tendrás que preocuparte por posibles diferencias entre el sistema de archivos real y tu versión simulada de él.