1

我使用 googletest 作为 Qt 项目的主要测试框架。QAbstractItemModelTester 有助于捕捉自定义项目模型类中最常见的错误,但我不知道如何在 googletest 单元测试中集成报告的故障(QTest)。

4

1 回答 1

0

我没有找到任何直接的方法来做到这一点,但这是我为在 QAbstractItemModelTester 中测试错误所做的断言:

class AssertNoQtLogWarnings
{
    static void messageHandlerTest(QtMsgType type, const QMessageLogContext& context, const QString& msg)
    {
        static bool NO_WARNING_MSG = true;
        QByteArray localMsg = msg.toLocal8Bit();
        const char* file = context.file ? context.file : "";
        const char* function = context.function ? context.function : "";
        switch (type) {
        case QtDebugMsg:
            fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
            break;
        case QtInfoMsg:
            fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), file, context.line, function);
            break;
        case QtWarningMsg:
            EXPECT_EQ(false, NO_WARNING_MSG) << msg.toStdString();
            break;
        case QtCriticalMsg:
            EXPECT_EQ(false, NO_WARNING_MSG) << msg.toStdString();
            break;
        case QtFatalMsg:
            EXPECT_EQ(false, NO_WARNING_MSG) << msg.toStdString();
            break;
        }
    }
public:
    AssertNoQtLogWarnings()
    {
        qInstallMessageHandler(messageHandlerTest);
    }

    ~AssertNoQtLogWarnings()
    {
        //Install default message handler
        qInstallMessageHandler(nullptr);
    }
};

TEST(QAbstractItemModel, QAbstractItemModel)
{
    //RAII object. Any warning, critical or fatal message produced in this context
    //will produce a GTest fail assertion
    AssertNoQtLogWarnings logQtTest; 

    MyAbstractItemModel model;
    QAbstractItemModelTester tester(&model, QAbstractItemModelTester::FailureReportingMode::Warning);
    
}
于 2020-09-18T13:35:31.207 回答