【发布时间】:2014-04-05 09:11:29
【问题描述】:
到目前为止,我一直在使用 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 测试时通常如何处理抛出异常的代码?
【问题讨论】:
-
对我来说,您的 Boost Test 解决方案看起来不错。与该有效解决方案相比,您要解决的问题是什么?
-
实际上没什么大不了的,我必须解决一些小问题才能让 boost.test 工作(例如,在 jenkins 中获取报告,因为 boost.test 无法输出 jUnit兼容的 xml),并且似乎 boost.test 不再被开发/维护。并在听到一些关于 BDD 之后对它感到好奇。我会稍微更新一下问题。
-
我认为 Boost.Test 非常成熟——它不是“维护”的,因为它不需要。你可以打赌,如果其中有彻底的错误,他们会得到修复,因为 Boost 人员是官方维护者,他们反应迅速。这是一个关于如何让 Jenkins 理解 Boost Test 输出的问题:stackoverflow.com/questions/16537914/…
-
啊,好的。很公平 :) 我有 boost.test 来理解覆盖率和诸如此类的输出,所以这已经修复了。不过,我仍然很好奇 BDD 处理异常的方式是什么。
标签: c++ unit-testing bdd catch-unit-test