C++ QObject::deleteLater在我的Qt测试中未按预期调用
我正在测试一个共享库,其中包含对C++ QObject::deleteLater在我的Qt测试中未按预期调用,c++,qt,qtestlib,C++,Qt,Qtestlib,我正在测试一个共享库,其中包含对deleteLater的内部调用。 库中没有运行事件循环,因此应用程序的要求是运行事件循环,以便正确释放所有内存 但是在测试中,对象dtor没有按预期调用 例如: void test1() { Foo foo; QSignalSpy spy(&foo, SIGNAL(mySignal(Status))); foo.do(); // should trigger mySignal QVERIFY(spy.wait(10
deleteLater
的内部调用。
库中没有运行事件循环,因此应用程序的要求是运行事件循环,以便正确释放所有内存
但是在测试中,对象dtor没有按预期调用
例如:
void test1()
{
Foo foo;
QSignalSpy spy(&foo, SIGNAL(mySignal(Status)));
foo.do(); // should trigger mySignal
QVERIFY(spy.wait(10000)); // event loop started for 10 s max
QCOMPARE(spy.count(), 1);
QList<QVariant> sig = spy.takeFirst();
Foo::Status status = qvariant_cast<Foo::Status>(sig.at(0));
QVERIFY2(status == Foo:Ok, "Failed");
}
我在m_obj的dtor中添加了一些调试打印,在执行test1时不会调用它
但是,如果我执行两次测试(通过添加test1的副本test2插槽),那么它将被调用一次
我的理解是,当发出信号时,它会停止spy事件循环,然后永远不会调用deleteLater
。
在这之后,第二个事件循环在test2中启动,它将处理来自前一个test1的挂起删除
对吗?
谢谢。是的,你说得对。由于
QSignalSpy
和Foo
位于同一线程中,因此信号mySignal
不是通过事件循环传递的,而是通过直接连接传递的。因此,在myslot
中发出信号后,事件循环立即停止。但是,由于同一事件循环调用了myslot
,因此只有当myslot
返回时,控件才会返回到它。因此,当事件循环可能执行deleteLater
请求的清理时,它已经停止
如果您想测试m_obj
是否正确清理,您可以创建一个额外的QSignalSpy
,并将其连接到每个QObject
销毁时发出的QObject::destrocted
信号
但是,您需要在构造函数中或通过setter将m_obj
作为对Foo
的依赖项传入,而不是在Foo
本身中构造它
然后,测试可能会如下所示:
void test1()
{
auto obj = new Obj{}; // will be assigned to `Foo::m_obj`
Foo foo{obj};
QSignalSpy deletion_spy(obj, &QObject::destroyed);
QSignalSpy mysignal_spy(&Foo, &Foo::mySignal);
QVERIFY(deletion_spy.wait(10000));
QCOMPARE(deletion_spy.count(), 1); // verify that `obj` got deleted
QCOMPARE(mysignal_spy.count(), 1);
QList<QVariant> sig = spy.takeFirst();
Foo::Status status = qvariant_cast<Foo::Status>(sig.at(0));
QVERIFY2(status == Foo:Ok, "Failed");
}
void test1()
{
auto obj=new obj{};//将被分配给'Foo::m_obj'`
Foo Foo{obj};
QSignalSpy删除(对象和对象::已销毁);
QSignalSpy mysignal_spy(&Foo,&Foo::mysignal);
QVERIFY(删除_spy.wait(10000));
QCOMPARE(deletation_spy.count(),1);//验证是否删除了'obj'
QCOMPARE(mysignal_spy.count(),1);
QList sig=spy.takeFirst();
Foo::Status Status=qvariant_cast(sig.at(0));
QVERIFY2(状态==Foo:Ok,“Failed”);
}
void test1()
{
auto obj = new Obj{}; // will be assigned to `Foo::m_obj`
Foo foo{obj};
QSignalSpy deletion_spy(obj, &QObject::destroyed);
QSignalSpy mysignal_spy(&Foo, &Foo::mySignal);
QVERIFY(deletion_spy.wait(10000));
QCOMPARE(deletion_spy.count(), 1); // verify that `obj` got deleted
QCOMPARE(mysignal_spy.count(), 1);
QList<QVariant> sig = spy.takeFirst();
Foo::Status status = qvariant_cast<Foo::Status>(sig.at(0));
QVERIFY2(status == Foo:Ok, "Failed");
}