使用带有Boost测试的枚举类

时间:2015-06-16 06:28:20

标签: c++ boost-test enum-class

我有一个我想在单元测试中使用的枚举类:

enum class MyEnumClass
{
    MyEntryA,
    MyEntryB
};

我想用它如下:

MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_CHECK_EQUAL(myEnumValue, MyEnumClass::MyEntryB);

但是我得到了这个错误,显然是因为boost测试试图输出值:

include/boost/test/test_tools.hpp:326:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
         ostr << t; // by default print the value
              ^

添加丑陋的static_cast“解决了”问题:

BOOST_CHECK_EQUAL(static_cast<int>(myEnumValue), static_cast<int>(MyEnumClass::MyEntryB));

但是我想避免为每个枚举类做到这一点。我还想避免为每个枚举类定义<<流运算符。

是否有更简单的方法将枚举类与boost测试一起使用?

或者其他单元测试框架有更好的方法来处理枚举类吗?

4 个答案:

答案 0 :(得分:4)

另一种解决方案是使用BOOST_CHECK(myEnumValue == MyEnumClass::MyEntryB),而不是BOOST_CHECK_EQUAL。这对我有用,我假设对于一个简单的真/假检查,boost不需要打印出枚举类。

答案 1 :(得分:2)

问题是Boost.Test必须打印该值以防它们不相等,并且它在流上使用operator<<来执行此操作。

在这种情况下,没有更简洁的方法,只需在operator<<std::ostreamstatic_cast简单地定义int,我就可以看到。

另一方面,像Catch这样的库没有这些要求,他们可能会使用一些宏魔法来实现它。

答案 2 :(得分:2)

解决方案:

enum class MyEnumClass {
  MyEntryA,
  MyEntryB
};

MyEnumClass myEnumValue = MyEnumClass::MyEntryA;
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryA)); // Note extra pair of brackets
BOOST_TEST((myEnumValue == MyEnumClass::MyEntryB)); // Note extra pair of brackets

结果:

info: check (myEnumValue == MyEnumClass::MyEntryA) has passed
error: in "Suite/Test": check (myEnumValue == MyEnumClass::MyEntryB) has failed

详细说明:

  1. 使用BOOST_TEST()作为测试通用宏(Assertion Boost Test Universal Macro):

    • BOOST_TEST //或BOOST_TEST_CHECK
    • BOOST_TEST_REQUIRE
    • BOOST_TEST_WARN
  2. 似乎应该将范围内的枚举(枚举类)添加到需要额外一对括号的Limitations and workaround

答案 3 :(得分:1)

这是我的解决方案(是如此简单)

在测试文件顶部添加

#define CHECK_ENUM_CLASS_EQUAL(L, R) BOOST_CHECK_EQUAL(static_cast<int>(L), static_cast<int>(R))

示例:

CHECK_ENUM_CLASS_EQUAL(a, MyEnumClass::MyEntryA);