Pregunta

Actualmente estoy ejecutando Qt 4.7.4 en Mac OS X 10.6. Instalé QT usando MacPorts.

He estado tratando de usar el desarrollo basado en pruebas como parte de mi práctica de codificación, y estoy usando QtTest para este propósito. Tengo una clase derivada de Qobject, y cuando intento probar el código, mi prueba falla cuando debe pasar. Miré la salida de (Test -Vs) y observo el siguiente error:

Información: Periodictable :: ElementTest :: testName () señal: QObject (7fff5fbfd860) destruido ((QObject*) 7FFFF5FBFD860)

En un caso de prueba, observo el error anterior dos veces, intercalando la prueba real. Esto indica que el objeto infantil se destruye antes del uso y aparentemente se elimina nuevamente después de la prueba. He usado QPointer y confirmé que el objeto se vuelve inválido antes del uso. La alternativa es inicializar las variables dentro de cada caso de prueba, derrotando así el propósito de una inicialización de un solo disparo y, a su vez, aumentando el bloqueo de código.

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);
};

Utilizo el siguiente comando (a través de 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- no literal -wdisable-optimization -wformat-y2k -winit-self -winvalid-pch -wunsafe-loop-optimizaciones -wmissing-format-attribute -wmissing-include-dirs -wstrict-aliasing = 3 -wswitch-inum -wvariadic-macros- Wvolatile -register -var -std = gnu ++ 0x -fmessage -longitud = 0 -ftree -vectorize - -param max -unroll -Times = 4 -pipe -fabi -version = 4 -g -i/opt/local/include /Qtcore -fpic -fstack -propector -fpic -fstack -propector -wstack -propector

No puedo recordar haber experimentado este problema con Qt 4.6, y estoy confundido en cuanto a la destrucción prematura.

Me gustaría pensar que este no es un error dentro de QT, pero tengo curiosidad si alguien más hubiera encontrado tal problema y haya encontrado una solución. Me gusta QT, pero este problema no se limitará a las pruebas unitarias. Ciertamente, cualquier ayuda será apreciada.

-- Editar --

Código fuente para el caso de prueba:

en el archivo .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

en el archivo .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);
}
¿Fue útil?

Solución

Esta línea en ElementTest::initTestCase():

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

está creando una variable local con nombre element que no tiene nada que ver con el miembro ElementTest::element. El vairable local se está destruyendo cuando ElementTest::initTestCase() devoluciones.

Intente cambiar la línea a:

element = new Element(this);    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top