Je suis actuellement sous Qt 4.7.4 sous Mac OS X 10.6. J'ai installé Qt en utilisant MacPorts.QObject double suppression
J'ai essayé d'utiliser le développement piloté par les tests dans le cadre de ma pratique de codage, et j'utilise QtTest à cette fin. J'ai une classe dérivée de QObject, et quand j'essaye de tester le code, mon test échoue quand il devrait passer. Je regardais la sortie (test -vs), et je vois l'erreur suivante:
INFO : periodictable::ElementTest::testName() Signal: QObject(7fff5fbfd860) destroyed ((QObject*)7fff5fbfd860)
Dans un test, je constate l'erreur ci-dessus deux fois, prenant en sandwich le test réel. Cela indique que l'objet enfant est détruit avant l'utilisation et semble de nouveau supprimé après le test. J'ai utilisé QPointer et confirmé que l'objet devient invalide avant utilisation. L'alternative consiste à initialiser les variables dans chaque cas de test, ce qui annule le but d'une initialisation à une seule impulsion et, à son tour, augmente le gonflement du code.
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);
};
J'utilise la commande suivante (via 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
Je ne me rappelle pas l'expérience de ce problème avec Qt 4.6, et je suis confus quant à la destruction prématurée.
Je voudrais penser que ce n'est pas un bug dans Qt, mais je suis curieux de savoir si quelqu'un d'autre a rencontré un tel problème et trouvé une solution. J'aime Qt, mais ce problème ne se limitera pas aux tests unitaires. Toute aide sera certainement appréciée.
- Edition -
code source pour le cas de test:
dans le fichier .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
dans le fichier .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);
}
pouvez-vous nous montrer le code de test pour la classe? – fabrizioM