如果你以前用过CPP,你可能知道它
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;
};
下面是我的专业化CPP单元断言类的尝试:
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文件的顶部,并把它放在一个包含项目范围断言特性专门化的主头文件中,比如一个用于rwcstring的文件,它可以完美地工作。不知怎么的,每当一个测试用例失败时,它坚持将我的时间打印为一个浮点值(大概是一个双精度值;在cppUnit中内置了双精度值的专门化)——这就是为什么我确保在上面的最小化代码中包含我的到/从双精度转换操作符的原因。
我所做的事情本身有什么问题吗?专业化是否需要在编译过程中的某一点出现,也许我还没有找到这一点?这个虚构的点是每个翻译单位还是每个项目?我使用的是VS2008。