【问题标题】:Unit tests with Qt: change StandardPaths used in tested functions使用 Qt 进行单元测试:更改测试函数中使用的 StandardPaths
【发布时间】:2016-02-20 15:48:22
【问题描述】:

我正在为 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 )

测试的输出是

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"

问题

createDb() 如何使用 Qt 的测试 StandardPaths 而不是真实的?

【问题讨论】:

    标签: c++ qt unit-testing


    【解决方案1】:

    测试不应该使用全局变量,“QStandardPaths::writableLocation”是全局变量的包装器。 我认为如果不注入此依赖项,您就无法摆脱困境:您可以:

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

    【讨论】:

    • 您能详细说明一下吗?我不确定是否真正理解:它似乎会增加代码的复杂性,这不好。
    • 现在我的 createDB 是 createDB(QString dbName, QString dbPath) 这样我就没有问题了。我的测试通过了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    相关资源
    最近更新 更多