Есть ли способ замаскировать фиктивный объект как приемлемый объект PyQt в параметрах метода Qt?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ замаскировать фиктивный объект как приемлемый объект PyQt в параметрах метода Qt?

Сообщение Anonymous »

Это MRE. Вам необходимо установить pytest... и на самом деле pytest-qt не причинит никакого вреда.

Код: Выделить всё

import sys, pytest
from PyQt5 import QtWidgets
from unittest import mock

class MyLineEdit(QtWidgets.QLineEdit):
def __init__(self, parent):
super().__init__(parent)

class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Pytest MRE")
self.setMinimumSize(400, 200)
layout = QtWidgets.QVBoxLayout()
qle = MyLineEdit(self)
layout.addWidget(qle)
self.setLayout(layout)

if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

def test_MyLineEdit_sets_a_title():
mock_window = mock.Mock(spec=QtWidgets.QWidget)

print(f'mock_window.__class__ {mock_window.__class__}') # says "QWidget"
print(f'type(mock_window) {type(mock_window)}') # says "mock.Mock"

with mock.patch('PyQt5.QtWidgets.QLineEdit.setWindowTitle') as mock_set_title:
my_line_edit = MyLineEdit(mock_window)

mock_set_title.assert_called_once()
assert False
Это иллюстрирует повторяющуюся проблему, и я не уверен, есть ли способ ее обойти: я хочу передать макет в качестве параметра метода класса PyQt (в данном случае конструктор: проблема возникает при передаче макета суперклассу __init__).
Обычно, когда я пытаюсь запустить этот тест, я получаю:

Код: Выделить всё

E       TypeError: arguments did not match any overloaded call:
E         QLineEdit(parent: Optional[QWidget] = None): argument 1 has unexpected type 'Mock'
E         QLineEdit(contents: Optional[str], parent: Optional[QWidget] = None): argument 1 has unexpected type 'Mock'
test_grey_out_qle_exp.py:7: TypeError
Я сталкиваюсь с этой проблемой во многих сценариях: «имеет неожиданный тип 'Mock'»...
Снова и снова, во время моего тестируя приложения PyQt, я обнаружил, что мне нужно передать настоящий QtWidget (или другой реальный объект класса PyQt). Это, в свою очередь, может вызвать всевозможные проблемы, в худшем случае неприятные периодические ошибки «Нарушение прав доступа Windows»… в зависимости от того, от какого типа комбинации реальных объектов PyQt и макетов я пытаюсь получить результаты.
Я хочу каким-то образом замаскировать макет в код PyQt. Я пробовал различные комбинации MagicMock, spec, autospec и т. д. Но код PyQt никогда не обманешь. Похоже, что проверка осуществляется с помощью встроенной функции type(x). Однако я не знаю этого наверняка, так как не могу изучить какой-либо исходный код, поскольку оказывается, что модули PyQt автоматически генерируются из кода C++.
Одна вещь мне пришло в голову: можно ли исправить встроенную функцию type()... ? Вероятно, маловероятное решение, не в последнюю очередь потому, что модуль PyQt, как я подозреваю, не использует код Python при проверке типа. Однако я искал это, но безрезультатно.

Подробнее здесь: https://stackoverflow.com/questions/788 ... t-in-qt-me
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»