7

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

enum class MyEnumClass
{
    MyEntryA,
    MyEntryB
};

我想按如下方式使用它:

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

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

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

5 回答 5

5

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

于 2016-07-19T22:29:13.557 回答
3

问题是 Boost.Test 必须打印值以防它们不相等,并且它operator<<在流上使用来做到这一点。

在这种情况下,没有比简单地定义operator<<anstd::ostream或 to static_castan更清洁的方法了int,我可以看到。

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

于 2015-06-16T07:41:46.600 回答
3

解决方案:

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. 似乎应该将范围枚举(枚举类)添加到需要一对额外括号的限制和解决方法中。

于 2018-06-01T17:31:33.003 回答
3

您可以使用 禁用相关类型的打印BOOST_TEST_DONT_PRINT_LOG_VALUE()。来自Boost 文档

typedef std::pair<int,float> pair_type;

BOOST_TEST_DONT_PRINT_LOG_VALUE( pair_type )

在这种情况下,如果您得到不匹配,测试错误消息会告诉您,但它不会打印实际的不同值。

于 2015-11-24T02:11:12.963 回答
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);
于 2019-01-21T16:21:47.237 回答