Поддерживает ли инфраструктура тестирования Qt сравнение списка указателей или я что-то не так делаю?
Мой источник модульного теста выглядит следующим образом:
QList<QString *> list1;
QList<QString *> list2;
list1.append(new QString("test"));
list2.append(new QString("test"));
QCOMPARE(list1, list2);
После запуска этого теста я ожидал, что успешно пройден тест, но тест завершился неудачно со следующими результатами:
********* Start testing of ConfigurationTest *********
Config: Using QtTest library 5.5.1, Qt 5.5.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 5.4.0 20160609)
FAIL! : ConfigurationTest::test_sample(default) Compared lists differ at index 0.
Actual (list1): <null>
Expected (list2): <null>
Loc: [../unittest/sample_test.cpp(32)]
Totals: 0 passed, 1 failed, 0 skipped, 0 blacklisted
********* Finished testing of ConfigurationTest *********
Если список содержит не указательные элементы, QCOMPARE не имеет проблем с ним и возвращает «пропущенный» вывод.
в документы Вы можете прочитать это QCOMPARE
использует оператор сравнения для сравнения значений:
Макрос QCOMPARE сравнивает фактическое значение с ожидаемым с помощью
оператор равенства.
QList
также работает так же.
Это означает, что если в вашем списке хранятся указатели, используются операторы сравнения указателей, а не операторы сравнения базовых объектов (т. Е. Сравниваются значения указателей, а не значения объектов, на которые указывает). Указатели сравниваются равными, когда они указывают на один и тот же объект, и в вашем случае у вас есть два разных объекта, поэтому они не равны, даже если содержимое объектов идентично.
Итак, ответы таковы: QCOMPARE
поддерживает сравнение списков указателей — это не работает так, как вы ожидали. Правила сравнения указателей подробно описаны Вот.
Других решений пока нет …