TypeError: 'module' object is not callable with unittest
TypeError: 'module' object is not callable with unittest
作为单元测试的一部分,我正在尝试模拟 QDialog 中的 QDialogButtonBox 按钮单击。
我还没有找到在QDialog实例中到达QDialogButtonBox对象的解决方案。我找到的唯一解决方案是直接执行 QDialog().accept() 。也许有更好的方法?
测试无效,因为我有一个异常类型错误:'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()
作为单元测试的一部分,我正在尝试模拟 QDialog 中的 QDialogButtonBox 按钮单击。
我还没有找到在QDialog实例中到达QDialogButtonBox对象的解决方案。我找到的唯一解决方案是直接执行 QDialog().accept() 。也许有更好的方法?
测试无效,因为我有一个异常类型错误:'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()