2

現在、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);
}
4

1 に答える 1

1

この行ElementTest::initTestCase()

QPointer<Element> element(new Element(this));

elementメンバーとは関係のないという名前のローカル変数を作成していElementTest::elementます。ローカルのvairableはElementTest::initTestCase()戻ったときに破壊されています。

行を次のように変更してみてください。

element = new Element(this);    
于 2011-09-08T19:18:01.710 に答える