[英]QObject::deleteLater is not called as expected in my Qt Test
我正在測試一個共享庫,該deleteLater
內部包含對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");
}
Foo
類如下所示:
class Foo : public QObject
{
Q_OBJECT
// ... methods, signals, slots..
private slots:
// this call is asynchronous (depends on a network reply)
void myslot() {
//..
m_obj->deleteLater();
emit mySignal(Foo:Ok);
}
};
我在m_obj的dtor中添加了一些調試打印,在執行test1時不調用它。
但是,如果我執行兩次測試(通過添加作為test1副本的test2插槽),則它將被調用一次。
我的理解是,當發出信號時,它將停止間諜事件循環,然后deleteLater
不會調用deleteLater
。 在第二個事件循環在test2中開始之后,它將處理從先前的test1中掛起的刪除操作。
這是正確的嗎 ? 謝謝。
是的,你是對的。 由於QSignalSpy
和Foo
處於同一線程中,因此信號mySignal
不會通過事件循環傳遞,而是通過直接連接傳遞。 因此,事件循環在myslot
發出信號后立即停止。 但是,由於myslot
是由同一事件循環調用的,因此控件僅在myslot
返回時才返回。 因此,當事件循環有可能執行deleteLater
請求的清除時,它已經停止了。
如果要測試m_obj
是否正確清理,則可以創建一個附加的QSignalSpy
並將其連接到每個QObject
銷毀時發出的QObject::destroyed
信號。
但是,您將需要在構造函數中或通過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");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.