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.

¿Cómo hacer pruebas unitarias para validar argumentos en argparse utilizando assertRaises() en Python?

Cuando intento probar las validaciones de argumentos en argparse utilizando Unittest, lo siguiente funciona:

mymodule:

def validate_mac_addr(mac_addr):
    regex = re.compile(r'^((([a-f0-9]{2}:){5})|(([a-f0-9]{2}-){5}))[a-f0-9]{2}$', re.IGNORECASE)

    if re.match(regex, mac_addr) is not None:
        return mac_addr
    msg = f"[-] Dirección MAC no válida: '{mac_addr}'"
    raise argparse.ArgumentTypeError(msg)

test:

import mymodule
import unittest

def test_mac_address_false(self):
    self.assertRaises(Exception, mymodule.validate_mac_addr, "n0:ma:ca:dd:re:ss:here")

Pero quería capturar un error más específico como ‘ArgumentTypeError’, ¡pero aparentemente esto no es posible con assertRaises() en este ejemplo!? ¿Qué está sucediendo con el uso general de Exception en assertRaises()?

Por cierto,

isinstance(argparse.ArgumentTypeError, Exception)

¡Devuelve False?!

Ref.: https://hg.python.org/cpython/file/v3.5.2/Lib/argparse.py#l725

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código proporcionado demuestra cómo validar direcciones MAC utilizando argparse y unittest en Python. La función validate_mac_addr() utiliza expresiones regulares para validar la dirección MAC y genera un argparse.ArgumentTypeError con un mensaje personalizado si falla. El caso de prueba test_mac_address_false() llama a esta función con una dirección MAC no válida y espera que genere una excepción.

    Sin embargo, el caso de prueba no puede capturar la excepción más específica ArgumentTypeError que espera. Esto se debe a que assertRaises() en este ejemplo solo captura Exception y sus subclases, no la excepción específica ArgumentTypeError.

    Esto se debe a que argparse.ArgumentTypeError no es una subclase de Exception, sino que está definida como una clase separada que hereda de BaseException. Por lo tanto, isinstance(argparse.ArgumentTypeError, Exception) devuelve False.

    Para capturar ArgumentTypeError en assertRaises(), puedes utilizar un administrador de contexto de la siguiente manera:

        def test_mac_address_false(self):
            with self.assertRaises(argparse.ArgumentTypeError):
                mymodule.validate_mac_addr("n0:ma:ca:dd:re:ss:here")
    

    Aquí, el administrador de contexto espera explícitamente que la excepción ArgumentTypeError sea generada por la función validate_mac_addr().

Comments are closed.