Я начал использовать фреймворк для модульного тестирования «Catch», и пока он действительно хорош. Я использовал VS встроенную модульную систему тестирования с большой болью.
одна вещь, которую я заметил, что макрос REQUIRE_THROWS_AS
не ведет себя так, как следовало ожидать
из документов:
REQUIRE_THROWS_AS( expression, exception type ) and CHECK_THROWS_AS( expression, exception type )
Ожидает, что исключение указанного типа выдается во время
оценка выражения.
когда я пытаюсь написать
TEST_CASE("some test") {
SECTION("vector throws") {
std::vector<int> vec;
REQUIRE_THROWS_AS(vec.at(10), std::logic_error);
}
}
Я ожидаю, что тест не пройден, и все же он говорит, что тест пройден. есть ли ошибка в рамках или я не прав?
std::out_of_range
(который является то, что vector::at
следует бросить сюда) происходит от std::logic_error
:
Ни одна стандартная библиотека компонентов не генерирует это исключение напрямую, но типы исключений
std::invalid_argument
,std::domain_error
,std::length_error
,std::out_of_range
,std::future_error
, а такжеstd::experimental::bad_optional_access
получены изstd::logic_error
, — cppreference:
REQUIRE_THROWS_AS
скорее всего делает что-то вроде:
try { expression; }
catch (const exception_type&) { SUCCEED("yay"); return; }
catch (...) { FAIL("wrong exception type"); return; }
FAIL("no exception");
И из-за полиморфной природы исключений утверждение проходит.
Других решений пока нет …