TypeError: 'module' object is not callable with unittest

TypeError: 'module' object is not callable with unittest

作为单元测试的一部分,我正在尝试模拟 QDialog 中的 QDialogBu​​ttonBox 按钮单击。

  1. 我还没有找到在QDialog实例中到达QDialogBu​​ttonBox对象的解决方案。我找到的唯一解决方案是直接执行 QDialog().accept() 。也许有更好的方法?

  2. 测试无效,因为我有一个异常类型错误:'module' 对象不可调用,我不明白。我有什么不明白的?

这是代码:

import sys
import unittest
import threading
from PyQt5.QtWidgets import (
    QApplication,
    QDialog,
    QDialogButtonBox,
    QGridLayout,
    QGroupBox,
    QLabel,
    QMainWindow,
    QScrollArea,
    QVBoxLayout,
    QWidget,
)

app = QApplication(sys.argv)

class Fortest:
    def dial(self):
        dialog = QDialog()
        buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        layout = QVBoxLayout(dialog)
        param_box = QGroupBox("Iterate over parameters:")
        pblayout = QVBoxLayout()
        pblayout.setContentsMargins(0, 0, 0, 0)
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        scroll.setFrameStyle(scroll.NoFrame)
        scroll.setViewportMargins(0, 0, 0, 0)
        pblayout.addWidget(scroll)
        param_lay = QGridLayout()
        wid = QWidget()
        scroll.setWidget(wid)
        wid.setLayout(param_lay)
        param_box.setLayout(pblayout)
        layout.addWidget(param_box)
        layout.addWidget(buttonbox)
        buttonbox.accepted.connect(dialog.accept)
        buttonbox.rejected.connect(dialog.reject)
        param_lay.addWidget(QLabel("iter. / database:"), 0, 0, 1, 3)
        param_lay.addWidget(QLabel("iter.:"), 0, 3, 1, 2)
        param_lay.setColumnStretch(2, 1)
        param_lay.setColumnStretch(4, 1)
        param_lay.setRowStretch(0, 0)
        res = dialog.exec_()
        if res != dialog.Accepted:
            print("dialog not accepted")
            self.a = False
        else:
            print("dialog accepted")
            self.a = True

class Test(unittest.TestCase):
    def test(self):
        b = Fortest()
        threading.Timer(1, self.execute_click).start()
        b.dial()
        self.assertEqual(b.a, True)
    def execute_click(self):
        w = QApplication.activeWindow()
        if isinstance(w, QDialog):
            w.accept()
 

if __name__ == "__main__":
    unittest(Test().test())

您有 2 个错误:

  • 您不应该使用线程来修改 GUI,在这种情况下最好使用 QTimer。
  • 如果您想启动测试,则必须使用 unittest.main()unittest.main(Fortest())
import sys
import unittest

from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import (
    QApplication,
    QDialog,
    QDialogButtonBox,
    QGridLayout,
    QGroupBox,
    QLabel,
    QMainWindow,
    QScrollArea,
    QVBoxLayout,
    QWidget,
)

app = QApplication(sys.argv)


class Fortest:
    def dial(self):
        dialog = QDialog()
        buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        layout = QVBoxLayout(dialog)
        param_box = QGroupBox("Iterate over parameters:")
        pblayout = QVBoxLayout()
        pblayout.setContentsMargins(0, 0, 0, 0)
        scroll = QScrollArea()
        scroll.setWidgetResizable(True)
        scroll.setFrameStyle(scroll.NoFrame)
        scroll.setViewportMargins(0, 0, 0, 0)
        pblayout.addWidget(scroll)
        param_lay = QGridLayout()
        wid = QWidget()
        scroll.setWidget(wid)
        wid.setLayout(param_lay)
        param_box.setLayout(pblayout)
        layout.addWidget(param_box)
        layout.addWidget(buttonbox)
        buttonbox.accepted.connect(dialog.accept)
        buttonbox.rejected.connect(dialog.reject)
        param_lay.addWidget(QLabel("iter. / database:"), 0, 0, 1, 3)
        param_lay.addWidget(QLabel("iter.:"), 0, 3, 1, 2)
        param_lay.setColumnStretch(2, 1)
        param_lay.setColumnStretch(4, 1)
        param_lay.setRowStretch(0, 0)
        res = dialog.exec_()
        if res != dialog.Accepted:
            print("dialog not accepted")
            self.a = False
        else:
            print("dialog accepted")
            self.a = True


class Test(unittest.TestCase):
    def test(self):
        b = Fortest()
        QTimer.singleShot(1000, self.execute_click)
        b.dial()
        self.assertEqual(b.a, True)

    def execute_click(self):
        w = QApplication.activeWindow()
        if isinstance(w, QDialog):
            w.accept()


if __name__ == "__main__":
    unittest.main()