& Quot; Поймайте & Quot; структура модульного тестирования — REQUIRE_THROWS_AS

Я начал использовать фреймворк для модульного тестирования «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);
}
}

Я ожидаю, что тест не пройден, и все же он говорит, что тест пройден. есть ли ошибка в рамках или я не прав?

1

Решение

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

И из-за полиморфной природы исключений утверждение проходит.

5

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

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