【问题标题】:QT Test using namespaces使用命名空间的 QT 测试
【发布时间】:2020-01-02 19:33:49
【问题描述】:

我在 QT5 中使用 QT Test 并注意到他们的文档 (https://doc.qt.io/qt-5/qttestlib-tutorial1-example.html#writing-a-test) 中的示例都没有使用自定义(非 QT)命名空间,实际上甚至没有引用 QT 命名空间。

考虑到这对 c++ 来说是更好的做法,我尝试使用命名空间,但随后测试无法正常工作。

这是 QT 文档提供的第一个示例: https://code.qt.io/cgit/qt/qtbase.git/tree/examples/qtestlib/tutorial1/testqstring.cpp?h=5.13

//! [0]
#include <QtTest/QtTest>

class TestQString: public QObject
{
     Q_OBJECT
private slots:
    void toUpper();
};
//! [0]

//! [1]
void TestQString::toUpper()
{
    QString str = "Hello";
    QCOMPARE(str.toUpper(), QString("HELLO"));
}
//! [1]

//! [2]
QTEST_MAIN(TestQString)
#include "testqstring.moc"
//! [2]

使用命名空间是我创建了在使用 QT 测试时应该做的事情还是不必要的事情?

【问题讨论】:

  • 您是否想在项目中使用命名空间与 Qt 或 QTest 没有任何关系。无论有没有命名空间,它都应该同样适用。
  • 什么不起作用?你有没有像这样调整宏调用:QTEST_MAIN(MyNamespace::TestQString)

标签: c++ qt namespaces qt5 qttest


【解决方案1】:

不确定我是否理解得很好,也许你正在寻找这个?

testqstring.cpp

#include <QtTest>

namespace Test {

   class TestQString: public QObject
   {
        Q_OBJECT
   private slots:
       void toUpper()
       {   
          QString str = "Hello";
          QCOMPARE(str.toUpper(), QString("HELLO"));
       }
   };

} // end namespace Test

QTEST_APPLESS_MAIN(Test::TestQString)

#include "testqstring.moc"

注意宏 QTEST_APPLESS_MAIN 扩展在

#define QTEST_APPLESS_MAIN(TestObject) \
int main(int argc, char *argv[]) \
{ \
    TestObject tc; \
    QTEST_SET_MAIN_SOURCE_PATH \
    return QTest::qExec(&tc, argc, argv); \
}

所以它必须在任何命名空间之外,但是因为它不在命名空间中,所以需要使用正确的范围传递类对象,namespace::class

【讨论】:

  • 这是我尝试过的除了APPLES_Main之外的。无论出于何种原因,测试在自定义命名空间内时都不会运行,所以我删除了命名空间并且它工作了
  • @Yeet 您需要显示不起作用的代码(以及错误消息)
  • @Yeet 我的代码可以正常编译和运行。如果解析正确,您可以立即在“测试”面板中的 QtCreator 上看到它。因此,或者您遗漏了某些内容,或者您​​的代码中出现了其他错误。
  • @Yeet 清理项目确保所有 moc 和 .o 已被删除,然后运行 ​​qmake 并再次构建
  • 我实际上在使用 scons,所以过程有点不同,但谢谢,我会试试的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2021-07-12
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多