簡體   English   中英

QObject :: deleteLater沒有在我的Qt測試中按預期方式被調用

[英]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中掛起的刪除操作。

這是正確的嗎 ? 謝謝。

是的,你是對的。 由於QSignalSpyFoo處於同一線程中,因此信號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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM