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 probar una aplicación de PyQt que utiliza argparse para los parámetros de entrada.

Tengo una aplicación PyQt que utiliza argparse para pasar algunos argumentos.

Logré escribir una prueba simple para ver si la aplicación comienza.

Pero no puedo establecer/simular los argumentos de argparse
Lo sé porque dentro del código tengo algunos try/except como este

    try:
        if args.erase_data:
            pass

    except NameError:
        logger.error("Error al analizar el argumento de entrada erase_data \n")

que durante las pruebas fallan, mientras que no fallan si ejecuto la aplicación.
Intenté esto para simular args

import os
import pathlib

# import pdb
import sys
from unittest import mock

import pytest
from PyQt5 import QtTest
from PyQt5.QtWidgets import *
from pytestqt.plugin import QtBot

sys.path.append(os.getcwd())
src_dir = pathlib.Path(__file__).parents[1].absolute()
print(src_dir)
sys.path.append(src_dir.as_posix())

GUI = __import__("GUI")


@pytest.fixture(scope="module")
def qtbot_session(qapp, request):
    result = QtBot(qapp)
    with capture_exceptions() as e:
        print(getattr(e, "message", repr(e)))
        yield result
    print("  TEARDOWN qtbot")


@pytest.fixture(scope="module")
def Viewer(request):

    with mock.patch.object(sys, "argv", ["",' -d','2']):
        print("simulando sys argv")
        print(sys.argv)
        # pdb.set_trace()
        app, app_window = GUI.main()

        qtbotbis = QtBot(app)
        QtTest.QTest.qWait(0.5 * 1000)
        assert app_window.isVisible()
        return app, app_window, qtbotbis

pero args aún no está configurado.
¿Alguna idea de cómo solucionarlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el mock patch para sys.argv no está funcionando como se esperaba. Aquí hay algunas sugerencias para intentar resolver este problema:

    1. Verifique si argparse está configurado correctamente en el archivo de prueba. Asegúrese de pasar los argumentos correctos al objeto ArgumentParser.
    2. En lugar de hacer un mock de sys.argv, intente usar el objeto unittest.mock.MagicMock para crear una instancia mock del espacio de nombres de argparse. Aquí hay un ejemplo:

    from unittest.mock import MagicMock
    
    @patch('argparse.ArgumentParser.parse_args')
    def test_args(mock_args):
        mock_args.return_value = MagicMock(erase_data=True)
        app = QApplication(sys.argv)
        # Aquí va tu código de prueba
    

    Esto creará una instancia mock del espacio de nombres de argparse con el atributo erase_data establecido en True.

    1. Si las soluciones anteriores no funcionan, intente usar la biblioteca pytest-mock. Esta biblioteca proporciona capacidades de mocking fáciles de usar y poderosas para las pruebas de pytest. Aquí hay un ejemplo de cómo usarla:
    def test_args(mocker):
        mocker.patch('argparse.ArgumentParser.parse_args', return_value=MagicMock(erase_data=True))
        app = QApplication(sys.argv)
        # Aquí va tu código de prueba
    

    Esto creará una instancia mock del espacio de nombres de argparse con el atributo erase_data establecido en True, utilizando la biblioteca pytest-mock.

    Esperemos que una de estas soluciones resuelva tu problema con el mocking de argumentos de argparse en tu prueba de aplicación PyQt.

Comments are closed.