【问题标题】:Test function that depends on QApplication with gmock使用 gmock 依赖 QApplication 的测试功能
【发布时间】:2014-10-29 13:56:28
【问题描述】:

我想测试一种使用

获取主屏幕屏幕尺寸的方法
void MouseMapper::getScreenProperties() {
    QDesktopWidget *widget = QApplication::desktop();
    QRect screenGeometry = widget->screenGeometry(widget->primaryScreen());
    _screenHeight = screenGeometry.height();
    _screenWidth = screenGeometry.width();
}

这可以正常工作。但是当我尝试使用 gmock 来测试它时

TEST(AMouseMapper, GetsTheScreenSize) {
    MouseMapper mouse;
    mouse.getScreenProperties();
    //I know these hardcodes values don't always apply,
    //thats not the point here
    ASSERT_EQ(1900, mouse.getScreenWidth());
    ASSERT_EQ(1200, mouse.getScreenHeight());
}

#include "gmock/gmock.h"

int main(int argc, char** argv) {
    testing::InitGoogleMock(&argc, argv);
    return RUN_ALL_TESTS();
}

我得到一个错误,因为我没有构造一个 QApplication,这是正确的。 所以当我尝试

#include "gmock/gmock.h"
#include <QApplication>

int main(int argc, char** argv) {
    testing::InitGoogleMock(&argc, argv);
    QApplication app(argc,argv);
    app.exec();
    return RUN_ALL_TESTS();
}

我得到同样的错误。当我尝试直接在测试函数中构造 QApplication(如 this answer 中所建议的那样)时,也会发生测试崩溃,因为 argc 和 argv 不正确或其他原因

TEST(AMouseMapper, GetsTheScreenSize) {
    char  arg0[] = "programName";
    char* argv[] = { &arg0[0], NULL };
    int   argc   = (int)(sizeof(argv) / sizeof(argv[0])) - 1;
    QApplication app(argc,&argv[0]);
    app.exec();
    MouseMapper mouse;
    mouse.getScreenProperties();
    ASSERT_EQ(1900, mouse.getScreenWidth()); //I know that these hardcoded values don't always apply
    ASSERT_EQ(1200, mouse.getScreenHeight());
}

Valgrind 然后给了我

==7093== Conditional jump or move depends on uninitialised value(s)
==7093==    at 0x102E437A: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.25)
==7093==    by 0x7EA2473: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.0)
==7093==    by 0x7EBC056: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.0)
==7093==    by 0x7EBCEF9: g_signal_emit_by_name (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.0)
==7093==    by 0x7EA9BDA: g_object_set_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.0)
==7093==    by 0x7EAA46B: g_object_set (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.4200.0)
==7093==    by 0x5EB0BB5: ??? (in /home/elmewo/Libraries/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5.3.2)
==7093==    by 0x5E2D23E: QStyleFactory::create(QString const&) (in /home/elmewo/Libraries/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5.3.2)
==7093==    by 0x5DC9B4A: QApplication::style() (in /home/elmewo/Libraries/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5.3.2)
==7093==    by 0x5DCA51C: QApplicationPrivate::initialize() (in /home/elmewo/Libraries/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5.3.2)
==7093==    by 0x5DCA56F: QApplicationPrivate::construct() (in /home/elmewo/Libraries/Qt/5.3/gcc_64/lib/libQt5Widgets.so.5.3.2)
==7093==    by 0x47B10E: AMouseMapper_GetsTheScreenSize_Test::TestBody() (MouseMapperTest.cpp:18)

我不知道我能在这里做什么。任何人都可以帮忙吗?

P.s.:我不想在这里使用 QTest。 :)

【问题讨论】:

    标签: c++ qt gmock


    【解决方案1】:

    我们使用以下方法:

    int main(int argc, char** argv)
    {
        TestCoreApp app(argc, argv);
        ...
        app.exec();
    }
    

    在TestCoreApp的构造函数中:

    TestCoreApp::TestCoreApp(int& argc, char** argv)
        : QCoreApplication(argc, argv)
    {
        InitGMockAndGTest(argc, argv);
    }
    

    初始化函数:

    void TestCoreApp::InitGMockAndGTest(int& argc, char** argv) const
    {
        InitGoogleMock(&argc, argv);
        InitGoogleTest(&argc, argv);
    }
    

    您的 GoogleMockInit 在 QCoreApplication 初始化之前启动。

    testing::InitGoogleMock(&argc, argv);
    QApplication app(argc,argv);
    

    【讨论】:

    • 对不起,我不明白。只是为了澄清:TestCoreApp 是一个继承自 QCoreApplication 的类。什么是 QIWMTestCoreApp?
    • 是 TestCoreApp 继承自 QCoreApplication。而 QIWMT... 是复制粘贴错误。
    • 这对我不起作用。错误依旧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2021-12-09
    • 2015-03-08
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多