В настоящее время я использую Qt 4.7.4 на Mac OS X 10.6. Я установил Qt с помощью MacPorts.
Я пытался использовать разработку через тестирование как часть своей практики кодирования, и для этой цели я использую QtTest. У меня есть класс, производный от QObject, и когда я пытаюсь протестировать код, мой тест терпит неудачу, когда он должен пройти. Я посмотрел на вывод (test -vs) и обнаружил следующую ошибку:
ИНФОРМАЦИЯ: Periodtable::ElementTest::testName() Сигнал: QObject(7fff5fbfd860) уничтожен ((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-pro 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-протектор -fPIC -fstack-протектор -Wstack-протектор
Я не могу вспомнить эту проблему с 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);
}