首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt的单元测试:在测试函数中使用的更改StandardPaths

Qt的单元测试:在测试函数中使用的更改StandardPaths
EN

Stack Overflow用户
提问于 2016-02-20 15:48:22
回答 1查看 142关注 0票数 1

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

我的密码

我有一个函数要测试:

代码语言:javascript
复制
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;
}

所以在我的测试中:

代码语言:javascript
复制
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 )

测试的输出是

代码语言:javascript
复制
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而不是真正的测试StandardPaths?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-20 17:05:29

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

  • 让"createDB()“将路径的第一部分作为字符串参数
  • 让"createDB()“接受一个抽象类'pathLocator‘的参数,并使用一个虚拟函数'getBasePath’。生产代码将使用返回“/home/olivier/..local/share/”的具体子程序,而测试将使用返回“/home/olivier/. test /share/”的模拟子程序。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35525444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档