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