C++ 使用Qt的单元测试:更改测试函数中使用的标准路径

C++ 使用Qt的单元测试:更改测试函数中使用的标准路径,c++,qt,unit-testing,C++,Qt,Unit Testing,我正在为Qt中的函数编写单元测试 我的代码 我有一个要测试的函数: QSqlDatabase createDB() { QString database = "library"; QString dbPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); QDir appDataDir(dbPath); if (!appDataDir.exists()) {

我正在为Qt中的函数编写单元测试

我的代码 我有一个要测试的函数:

QSqlDatabase createDB() {
    QString database = "library";
    QString dbPath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
    QDir appDataDir(dbPath);
    if (!appDataDir.exists()) {
        appDataDir.mkpath(dbPath);
    }
    dbPath += "/" + database + ".sqlite";
    QSqlDatabase db;
    db.setDatabaseName(dbPath);
    return db;
}
因此,在我的测试中,我有:

void DatabaseManagerTest::initTestCase()
{
    QStandardPaths::setTestModeEnabled(true);
}

void DatabaseManagerTest::testDb()
{
    QSqlDatabase m_db = createDb();
    QString database = "library";
    QString databasePath_exp = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)
    + "/" + database + ".sqlite";

    QCOMPARE(m_db.databaseName(), databasePath_exp);
    qDebug() << m_db.databaseName();
}

QTEST_MAIN( DatabaseManagerTest )
问题
createDb()如何使用Qt的测试标准路径而不是真正的路径?

测试不应该使用全局变量,“QStandardPaths::writeablelocation”是全局变量的包装器。 我认为如果不注入这种依赖性,你就无法摆脱这种局面:你可以:

  • 让“createDB()”将路径的第一部分作为字符串参数
  • 让“createDB()”使用虚拟函数“getBasePath”获取抽象类“pathLocator”的参数。生产代码将使用返回“/home/olivier/.local/share/”的具体子级,而测试将使用返回“/home/olivier/.qtest/share/”的模拟子级

您能详细说明一下吗?我不确定是否真正理解:这似乎会增加代码的复杂性,这并不好。现在我的createDB是createDB(QString dbName,QString dbPath),这样我就不再有问题了。我的考试及格了!
1: FAIL!  : DatabaseManagerTest::testDb() Compared values are not the same
1:    Actual   (m_db.databaseName()): "/home/olivier/.local/share/MyTest/library.sqlite"
1:    Expected (databasePath_exp)   : "/home/olivier/.qttest/share/MyTest/library.sqlite"