单元测试 - 异常和 C++ 中的 BDD - 捕获库

unit testing - Exceptions and BDD in C++ - Catch library

本文关键字:BDD C++ 异常 单元测试 中的      更新时间:2023-10-16
到目前为止我一直

在使用 Boost.Test,但现在正在考虑将 BDD 与 Catch 一起使用,但我在找出处理异常的好方法时遇到了一些麻烦。假设我有一个这样的测试:

SCENARIO("connection handling", "[network]") {
    boost::asio::io_service io;
    GIVEN("a connection that should fail") {
        connection::ptr conn = connection::create(new fake_provider<connection_refused>(io));
        WHEN("trying to connect") {
            conn->connect("localhost", 1);
            THEN("connection was refused") {
                some stuff to verify exception code
                REQUIRE(conn->connected() == false);
            }
        }
    }
}

现在我想知道如何处理 connect() 会以一种很好的方式抛出异常的事实。我想我可以将异常保存并存储在 try-catch 中并在 THEN 下进行验证,但这似乎不是很好。在我的 Boost.Test 测试用例中,我做了这个:

bool error_is_connection_refused(boost::system::system_error ex) {
    return ex.code() == boost::system::errc::connection_refused;
}
BOOST_AUTO_TEST_CASE(connect)
{
    connection::ptr conn_refuse = connection::create(new fake_provider<connection_refused>(*io_ptr));
    BOOST_REQUIRE_EXCEPTION(conn_refuse->connect("localhost", 1),
                            boost::system::system_error,
                            error_is_connection_refused);
    BOOST_REQUIRE_EQUAL(conn_refuse->connected(), false);
}

但这似乎不是很BDD。人们在使用 BDD 测试时通常如何处理异常抛出代码?

我有点晚了,

因为我刚刚注意到捕获单元测试标签:-)

目前您可以执行以下操作:

REQUIRE_THROWS( <expr> );

或者测试特定异常类型

REQUIRE_THROWS_AS( <type>, <expr> );

如果要验证异常消息的内容...目前没有办法在不自己抓住它的情况下做到这一点。不过,这是我考虑添加的功能。

这是按照 philsquared 的建议验证异常内容的方法

#include <stdexcept>
#include "catch.hpp"
void my_func(double v) 
{
    // ...
}
TEST_CASE("wrong params", "[tag]") {
    SECTION("wrong rate") {
        try {
            my_func(1.1);  // must be in range [0..1]
            REQUIRE_FALSE("must raise issue about rate");
        }
        catch(const std::invalid_argument& e) {
            std::string str (e.what());
            std::string str2 ("rate");
            REQUIRE_FALSE(str.find(str2) == std::string::npos);
        }
    }
}