到目前为止,我一直在使用Boost.Test,但我现在正在考虑使用带有Catch的BDD,但我在查找处理异常的好方法时遇到了一些麻烦。说我有这样的测试:
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中并在那之下进行验证,但这看起来并不是很好。在我的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测试时,人们通常如何处理异常抛出代码?
答案 0 :(得分:6)
我有点迟到,因为我刚刚注意到了catch-unit-test标签: - )
目前你可以这样做:
REQUIRE_THROWS( <expr> );
或测试特定的异常类型:
REQUIRE_THROWS_AS( <type>, <expr> );
如果你想验证异常消息的内容......目前还没有办法在没有自己捕获的情况下执行此操作。不过,这是我考虑添加的功能。
答案 1 :(得分:0)
这是验证 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);
}
}
}