#python #python-3.x #mocking #python-unittest #pyside2
#python #python-3.x #издевательство #python-unittest #pyside2
Вопрос:
У меня есть тонна диалоговых окон и мастеров в большом приложении QT / Python, но я не могу определить, какой дочерний класс запускает родительский метод exec_. Есть ли способ сделать это с помощью mock или любой другой библиотеки? Конечно, я могу найти его через debug, но мне нужен программный способ сделать это.
import mock
from PySide2 import QtWidgets
class CustomDialog(QtWidgets.QDialog):
pass
class AnotherCustomDialog(QtWidgets.QDialog) :
pass
def launch_custom_dialog() :
dlg = CustomDialog()
dlg.exec_()
with mock.patch.object(QtWidgets.QDialog, 'exec_') as mock_dialog:
test_which_calls_launch_custom_dialog()
if mock_dialog.called:
# How do I find the name of the child? I.e. CustomDialog
Ответ №1:
Если вы вызываете это самостоятельно:
def launch_custom_dialog() :
dlg = CustomDialog() # or could be any of your custom dialogs
dlg.exec_()
return dlg
Затем вы можете создать свой собственный промежуточный базовый класс:
class CustomDialogBase(QtWidgets.QDialog):
def exec_(self, *args, **kwargs):
self.note_caller = self
return super().exec_(*args, **kwargs)
class CustomDialog(CustomDialogBase):
pass
class AnotherCustomDialog(CustomDialogBase) :
pass
Теперь вы можете проверить, какой это был дочерний класс:
dlg = launch_custom_dialog()
print(dlg.note_caller)
Комментарии:
1. Это отличный ответ. Спасибо. Это соответствует моему упрощенному примеру, однако на самом деле создание экземпляра dlg происходит глубоко внутри вложенных вызовов тестового примера, поэтому я не могу легко захватить его экземпляр. Я надеялся, что внутри самого макета найдется способ получить доступ к классу издеваемой функции.