Если вы уже использовали CPPUnit, вы, вероятно, знаете о его классе assertion_traits
, который шаблонизирован для обработки произвольных типов. Это то, что позволяет ему печатать «фактические» и «ожидаемые» значения для нестроковых типов при неудачных тестовых случаях. Я использовал это с успехом несколько раз, но для одного конкретного типа это не работает для меня. Вот частичное объявление для моего класса, класса его родителя и некоторых операторов, не являющихся членами (все это огромно, плюс моя компания не позволит мне опубликовать его):
class _declspec(dllexport) HWDBDateTime
{
public:
HWDBDateTime();
HWDBDateTime(const HWDBDateTime& other);
HWDBDateTime& operator=(const HWDBDateTime& other);
RWCString asString() const;
RWCString asString(const char *format, const boost::local_time::time_zone_ptr pZone = STimeZone::GetServerTimeZone()) const;
};
bool _declspec(dllexport) operator==(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator!=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator< (const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator<=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator> (const HWDBDateTime& dt1, const HWDBDateTime& dt2);
bool _declspec(dllexport) operator>=(const HWDBDateTime& dt1, const HWDBDateTime& dt2);
class _declspec(dllexport) STimeStamp : public HWDBDateTime
{
public:
STimeStamp();
STimeStamp(const STimeStamp& other);
STimeStamp(const HWDBDateTime& other);
explicit STimeStamp(double d);
STimeStamp& operator=(double d);
operator double() const;
};
А вот моя попытка специализировать класс утверждений CPPUnit:
template <>
struct CppUnit::assertion_traits<STimeStamp>
{
static bool equal( STimeStamp x, STimeStamp y )
{
return x == y;
}
static std::string toString( STimeStamp x )
{
return (const char *)x.asString();
}
};
Я пробовал передавать его по значению, как показано выше, также передавая константные ссылки, я пытался привести значения внутри функций к HWDBDateTime
(поскольку здесь определены операторы и asString()
методы), кажется, ничего не помогает. Я поместил его в верхнюю часть файла CPP моего набора тестов и поместил в главный заголовочный файл, содержащий специализации assertion_traits для всего проекта, например, для RWCString, который работает безупречно. Почему-то всякий раз, когда тестовый случай терпит неудачу, он настаивает на распечатке моего времени в виде значения с плавающей запятой (предположительно, двойного; специализация для двойного встраивается в CPPUnit) - вот почему я обязательно включил мой to / from операторы двойного преобразования в свернутом коде выше.
Что-то не так с тем, что я делаю? Должна ли специализация присутствовать в определенной точке процесса компиляции, и, может быть, я просто не нашел эту точку? Будет ли эта мифическая точка для каждой единицы перевода или проекта? Я использую VS2008.