Как проверить с помощью QTest, что выброшено исключение?

Я говорю в мире QT C++. Я делаю TDD, используя класс QTest. Я хочу убедиться, что при определенных условиях мой тестируемый класс выдает исключение. Используя тест Google, я бы использовал что-то вроде:

EXPECT_THROW(A(NULL), nullPointerException);

Существует ли что-то вроде этой функции в QTest? О, по крайней мере, способ сделать это?

Спасибо!


person Killrazor    schedule 20.02.2013    source источник
comment
исключения не очень распространены в мире qt. На самом деле в QTest нет специального макроса для этого, но вы можете сделать блок try catch и протестировать его с помощью QVERIFY. В качестве альтернативы вы также можете использовать google test с qt (что по нескольким причинам намного лучше, чем qtest imho)   -  person TWE    schedule 20.02.2013
comment
Да, к этому времени я понимаю, что gtest намного лучше, чем QTest. Спасибо!   -  person Killrazor    schedule 20.02.2013
comment
более того, gtest поддерживает gmock, в то время как для QTest ничего подобного нет. QTest действительно предназначен только для повседневного использования, а не для хорошего UT. Единственное, что вам нужно от QTest, если вы используете gtest, это QSignalSpy. Все остальное намного лучше в gtest.   -  person ixSci    schedule 20.02.2013
comment
Второй ответ должен быть правильным сейчас!   -  person Lennart Rolland    schedule 18.03.2017


Ответы (2)


Поскольку Qt5.3 QTest предоставляет макрос QVERIFY_EXCEPTION_THROWN, который обеспечивает недостающую функцию.

person Silicomancer    schedule 30.11.2014
comment
Единственная проблема заключается в том, что If not-substitutable type of exception is thrown or the expression doesn't throw an exception at all, then a failure will be recorded in the test log and the test won't be executed further.. Это означает, что практически не существует готового решения, позволяющего проверить, не выдает ли исключение данного типа (или производного). - person rbaleksandar; 03.11.2016
comment
Как проверить, что стандартный конструктор удален? Тестирование с помощью макроса вызывает исключение и прерывание выполнения. - person Matthias Herrmann; 08.04.2018

Этот макрос демонстрирует принцип.

Сравнение typeid — это особый вариант использования, поэтому вы можете использовать его или не использовать — оно позволяет макросу «провалить» тест, даже если выброшенное исключение является производным от того, с которым вы тестируете. Часто вы этого не захотите, но я все равно добавил!

#define EXPECT_THROW( func, exceptionClass ) \
{ \
    bool caught = false; \
    try { \
        (func); \
    } catch ( exceptionClass& e ) { \
        if ( typeid( e ) == typeid( exceptionClass ) ) { \
            cout << "Caught" << endl; \
        } else { \
            cout << "Derived exception caught" << endl; \
        } \
        caught = true; \
    } catch ( ... ) {} \
    if ( !caught ) { cout << "Nothing thrown" << endl; } \
};

void throwBad()
{
    throw std::bad_exception();
}

void throwNothing()
{
}

int main() {
    EXPECT_THROW( throwBad(), std::bad_exception )
    EXPECT_THROW( throwBad(), std::exception )
    EXPECT_THROW( throwNothing(), std::exception )

    return EXIT_SUCCESS;
}

Возвращает:

Caught
Derived exception caught
Nothing thrown

Чтобы адаптировать его для QTest, вам нужно принудительно сбой с QFAIL.

person cmannett85    schedule 20.02.2013
comment
Почему бы вам не использовать catch (const exceptionClass& e ) { \ if ( typeid( e ) == typeid( exceptionClass ) ) {, чтобы быть независимым от std::exception? - person ixSci; 20.02.2013
comment
Потому что, если исключение не является или не происходит от exceptionClass, блок catch будет пропущен. - person cmannett85; 20.02.2013
comment
Понятно, тогда достаточно добавить catch(...) и считать его необработанным - person ixSci; 20.02.2013
comment
Да, вы правы, поэтому, если это не std::exception или производное, это не приведет к прерыванию приложения QTest. - person cmannett85; 20.02.2013
comment
Я имел в виду немного другое, не просто добавить catch(...), но и заменить catch ( std::exception& e ) на catch (const exceptionClass& e ), тогда это будет полное решение. - person ixSci; 20.02.2013
comment
Это идеально для меня. Единственная проблема заключается в том, что QT всегда возвращает unhandledException, когда исключение не является производным от QException. Возможно, лучше вернуться к старому режиму кода возврата - person Killrazor; 21.02.2013