c++ - C++ 中的异常和 BDD - Catch 库

标签 c++ unit-testing bdd catch-unit-test

到目前为止,我一直在使用 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 测试时通常如何处理抛出异常的代码?

最佳答案

我来晚了一点,因为我刚刚注意到 catch-unit-test 标签:-)

目前你可以做的:

REQUIRE_THROWS( <expr> );

或测试特定异常类型:

REQUIRE_THROWS_AS( <type>, <expr> );

如果您想验证异常消息的内容……目前没有办法在您不自己捕获的情况下执行此操作。不过,这是我考虑过添加的功能。

关于c++ - C++ 中的异常和 BDD - Catch 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22878873/

相关文章:

c++ - 如何使用 thrust::lower_bound() 克服 VBO 索引计算期间的内存限制

java - 在测试中实例化多个 Spring Boot 应用程序

java - 如何使用 JAVA Rest Assure 修复此错误

java - 如何在java cucumber中查找步骤定义

php - 如何在 behat 中激活 mink

c++ - Qt中如何为parent声明child是共享指针

c++ - 对虚拟 thunk 的 undefined reference

java - 如何使用多个数据运行 JUnit 4 数据驱动测试

javascript - 建议在 Windows 上使用 Node JS 的 BDD 测试框架

c++ - 无法打开源文件 "crtdbg.h"(依赖于 "iostream")C/C++(1696)