Модульное тестирование Qt: функция QCOMPARE в списке указателей

Поддерживает ли инфраструктура тестирования 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 не имеет проблем с ним и возвращает «пропущенный» вывод.

0

Решение

в документы Вы можете прочитать это QCOMPARE использует оператор сравнения для сравнения значений:

Макрос QCOMPARE сравнивает фактическое значение с ожидаемым с помощью
оператор равенства.

QList также работает так же.

Это означает, что если в вашем списке хранятся указатели, используются операторы сравнения указателей, а не операторы сравнения базовых объектов (т. Е. Сравниваются значения указателей, а не значения объектов, на которые указывает). Указатели сравниваются равными, когда они указывают на один и тот же объект, и в вашем случае у вас есть два разных объекта, поэтому они не равны, даже если содержимое объектов идентично.

Итак, ответы таковы: QCOMPARE поддерживает сравнение списков указателей — это не работает так, как вы ожидали. Правила сравнения указателей подробно описаны Вот.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]