我目前在Mac OS X 10.6上运行Qt 4.7.4。我使用MacPorts安装Qt。QObject双删除
我一直在尝试使用测试驱动开发作为我的编码练习的一部分,我正在使用QtTest来达到此目的。我有一个派生自QObject的类,当我尝试测试代码时,测试失败时它应该通过。我看着(试验-Vs)的输出,并且我观察以下错误:
INFO : periodictable::ElementTest::testName() Signal: QObject(7fff5fbfd860) destroyed ((QObject*)7fff5fbfd860)
在测试情况下,我观察上述错误两次,夹着实际测试。这表明子对象在使用之前被销毁并且在测试后似乎再次被删除。我已经使用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 -Woverloaded-virtual -Wsign-promo -Wformat-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);
}
,你能告诉我们该类的测试代码? – fabrizioM