Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟PyQt方法_Python_Unit Testing_Mocking_Pyqt5 - Fatal编程技术网

Python 模拟PyQt方法

Python 模拟PyQt方法,python,unit-testing,mocking,pyqt5,Python,Unit Testing,Mocking,Pyqt5,我有一个从PyQT5类QWidget和Ui_对话框继承的现有类 我想使用一些与GUI完全无关的类功能。因此,我尝试模拟相关的位,例如uu init uu函数,它有许多特定于GUI的代码。类中还有一个特定的方法需要重写_getSqlQuery 不幸的是,这不起作用,因为像DlgSqlWindow那样从QtWidget继承的任何东西都必须在基类上调用init,所以我得到DlgSqlWindow类型的超级类uu init_uu从未被调用。没有明智的方法来做这件事吗?否则,我应该尝试重构代码,将GUI从

我有一个从PyQT5类QWidget和Ui_对话框继承的现有类

我想使用一些与GUI完全无关的类功能。因此,我尝试模拟相关的位,例如uu init uu函数,它有许多特定于GUI的代码。类中还有一个特定的方法需要重写_getSqlQuery


不幸的是,这不起作用,因为像DlgSqlWindow那样从QtWidget继承的任何东西都必须在基类上调用init,所以我得到DlgSqlWindow类型的超级类uu init_uu从未被调用。没有明智的方法来做这件事吗?否则,我应该尝试重构代码,将GUI从功能中分离出来,或者在GUI上进行单元测试,我不希望这样做,因为我希望单元测试尽可能紧凑。

一个可能的解决方案是只调用没有太多逻辑的超级QWidget:

导入单元测试 从unittest.mock导入修补程序 从PyQt5导入QtWidgets 类Ui_对话框对象: def setupUiself,对话框: 通过 类DlgSqlWindowQtWidgets.QWidget,Ui_对话框: def_getSqlQueryself: 通过 def parseSQLself: 从测试返回SELECT* def initself,*参数: qtwidts.QWidget.\uuuu init\uuuu self self.setupUiself 类TestPyQgsunittest.TestCase: def测试\注释\部件本身: app=QtWidgets.QApplication[] 查询=从测试中选择* 使用patch.objectDlgSqlWindow,_init,init: 使用patch.objectDlgSqlWindow,_getSqlQuery,返回\u value=query: a=DlgSqlWindowNone,无 self.assertEquala.parseSQL,查询 如果uuuu name uuuuu==\uuuuuuuu main\uuuuuuuu: unittest.main 但正如您所指出的,最佳解决方案是重构代码,因为您似乎将业务逻辑与GUI混合在一起,正如您所看到的,这会带来一些不便,并且不可维护

class TestPyQgs(unittest.TestCase):
  def test_comment_parsing(self):
    query = "SELECT * FROM test"
    with patch.object(DlgSqlWindow, "__init__", lambda x, y, z: None):
      with patch.object(DlgSqlWindow, "_getSqlQuery", return_value=query):
        a = DlgSqlWindow(None,None)
        self.assertEqual(a.parseSQL(), query)