2015-06-16 2 views
4

У меня есть класс перечислимую, что я хотел бы использовать в своих модульных тестов:Используйте классы перечислений с усилением Test

enum class MyEnumClass 
{ 
    MyEntryA, 
    MyEntryB 
}; 

Я хотел бы использовать его следующим образом:

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

Но я получить эту ошибку, очевидно, потому, что тест подталкивание пытается вывести значение:

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)); 

Но я бы хотел избежать этого для каждого класса enum. Я также хотел бы избежать определения операторов потока << для каждого класса enum.

Есть ли более простой способ использования классов перечисления с испытанием на повышение?

Или у других модулей тестирования модулей есть лучший способ справиться с классами enum?

+0

Возможный дубликат [Как я могу вывести значение класса enum в C++ 11] (http://stackoverflow.com/questions/11421432/how-can-i-output-the-value-of- ан-перечисление класса-в-c11) –

ответ

2

Вы можете отключить печать данного типа с помощью BOOST_TEST_DONT_PRINT_LOG_VALUE(). Из Boost docs:

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

BOOST_TEST_DONT_PRINT_LOG_VALUE(pair_type) 

В этом случае вы должны получить несоответствие, сообщение об ошибке тест покажет вам, но это, но не будет печатать действительные различные значения.

2

Проблема заключается в том, что Boost.Test должен печатать значение в случае, если они не равны, и для этого используется operator<<.

В этом случае нет никакого способа чище, чем просто определить operator<< на std::ostream или static_cast к int, что я могу видеть.

С другой стороны, библиотеки, такие как Catch, не имеют таких требований, и они, вероятно, используют некоторые макромагии для его выполнения.

1

Другим решением является использование BOOST_CHECK(myEnumValue == MyEnumClass::MyEntryB) вместо BOOST_CHECK_EQUAL. Это работает для меня, я предполагаю, что для простой проверки истины/ложности boost не нужно распечатывать класс enum.

Смежные вопросы