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