2

我开始使用“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);
    }
}

我预计测试会失败,但它说测试通过了。框架中有错误还是我错了?

4

1 回答 1

8

std::out_of_range(这vector::at应该在这里抛出)源自std::logic_error

没有标准库组件直接抛出此异常,但异常类型std::invalid_argumentstd::domain_errorstd::length_errorstd::out_of_rangestd::future_errorstd::experimental::bad_optional_access派生自std::logic_error. -- cpp 参考

REQUIRE_THROWS_AS可能会做类似的事情:

try { expression; } 
catch (const exception_type&) { SUCCEED("yay"); return; }
catch (...) { FAIL("wrong exception type"); return; }
FAIL("no exception");

并且由于异常的多态性,断言通过了。

于 2016-03-02T20:42:35.080 回答