現在、Mac OSX10.6でQt4.7.4を実行しています。MacPortsを使用してQtをインストールしました。
私はコーディングの一環としてテスト駆動開発を使用しようとしており、この目的でQtTestを使用しています。QObjectから派生したクラスがあり、コードをテストしようとすると、合格するはずのときにテストが失敗します。(test -vs)の出力を確認したところ、次のエラーが発生しました。
情報:periodictable :: ElementTest :: testName()シグナル:QObject(7fff5fbfd860)が破棄されました((QObject *)7fff5fbfd860)
テストケースでは、実際のテストを挟んで、上記のエラーを2回観察します。これは、子オブジェクトが使用前に破棄され、テスト後に再び削除されたように見えることを示しています。QPointerを使用し、使用前にオブジェクトが無効になることを確認しました。別の方法は、各テストケース内の変数を初期化することです。これにより、シングルショット初期化の目的が無効になり、コードの膨張が増加します。
class Element : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY valueChanged)
public:
Element(QObject* parent = 0) : QObject(parent) {}
void setName(const QString& name);
QString name() const;
Q_SIGNALS:
void valueChanged(QString value);
private:
QString elementName;
Q_DISABLE_COPY(Element);
};
私は次のコマンドを使用します(cmake経由):
g ++ -D_FORTIFY_SOURCE = 2 -D_GLIBCXX_FULLY_DYNAMIC_STRING -D_FORTIFY_SOURCE = 2 -DQT_TEST_LIB -DQT_CORE_LIB -DQT_DEBUG -Wformat-security -Wmissing-format-attribute -Wformat = 2 -Wctor-dtor-privacy -Wabi -Woverload nonliteral -Wdisabled-optimization -Wformat-y2k -Winit-self -Winvalid-pch -Wunsafe-loop-optimizations -Wmissing-format-attribute -Wmissing-include-dirs -Wstrict-aliasing = 3 -Wswitch-enum -Wvariadic-macros- Wvolatile-register-var -std = gnu ++ 0x -fmessage-length = 0 -ftree-vectorize --param max-unroll-times = 4 -pipe -fabi-version = 4 -g -I / opt / local / include / QtCore -fPIC -fstack-protector -fPIC -fstack-protector -Wstack-protector
Qt 4.6でこの問題が発生したことを思い出せません。また、早期の破壊について混乱しています。
これはQt内のバグではないと思いますが、他の誰かがそのような問題に遭遇して解決策を見つけたのではないかと思います。私はQtが好きですが、この問題は単体テストに限定されません。どんな助けでも確かにありがたいです。
- 編集 -
テストケースのソースコード:
.hファイル内
#ifndef TEST_ELEMENT_H
#define TEST_ELEMENT_H
#include <QtCore/QObject>
#include <QtCore/QPointer>
namespace hashtable
{
class Element; // Forward declaration
class ElementTest : public QObject
{
Q_OBJECT
private Q_SLOTS:
void initTestCase();
void testName();
private:
QString name;
QPointer<Element> element;
};
}
#endif
.cppファイル内
void ElementTest::initTestCase()
{
name = QString("Hydrogen");
mass = 1.008;
QPointer<Element> element(new Element(this));
return;
}
void ElementTest::testName()
{
element->setProperty("name", name);
QCOMPARE(element->property("name").toString(), name);
}