es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for 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 a read_yaml_from_cwd con este nombre de archivo, y tu prueba afirma que debería devolver None.

    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 devolver None.

    Sin embargo, hay un problema en tu código de prueba. Necesitas incluir self como primer parámetro en el método test_read_yaml_from_cwd, así:

    def test_read_yaml_from_cwd(self):
    

    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.

Comments are closed.