不幸的是,使用 Qt 测试模块是不可能的。你有几个选择:
添加绕过该对话框的测试挂钩:您需要检测代码以使其可测试。例如,您可以将testFile
请求文件的对象的属性设置为文件路径,如果设置了属性,则对象可以跳过请求文件。
const char k_testFile[] = "k_testFile";
MyClass::foo() {
...
auto testFile = property(k_testFile);
auto filePath = testFile.isNull()
? QFileDialog::getOpenFilePath(...)
: testFile.toString();
...
}
使用非本机对话框,然后它是一个普通的小部件,您可以使用 Qt 测试进行测试。
使用特定于平台的方法来查找本机对话框并与之交互。您需要为要测试的每个平台实施它。
您应该在文件加载后发出信号。测试可以等待那个信号。您甚至不需要使用显式线程来加载文件,异步加载文件的惯用方式是:
QString filePath = ...;
QtConcurrent::run(ioPool, [this, filePath]{
auto data = MyLoader::load(filePath);
emit haveFileData(data);
});
您调用此代码的类应该有一个haveFileData
信号,表明其他代码连接到并按需要继续。这ioPool
是用于 I/O 绑定操作的线程池,QThredPool::globalInstance()
如果您希望全局池成为 I/O 池,则可能是这样。CPU 和 I/O 绑定的线程池应该是分开的。
于 2016-08-09T20:51:18.070 回答