以前に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();
}
};
上で見たように、const参照も渡して、値を渡してみました。関数内の値をHWDBDateTime
(演算子とasString()
メソッドが定義されている場所なので)キャストしてみましたが、何も役に立たないようです。テストスイートのCPPファイルの先頭に配置し、プロジェクト全体のassertation_traits特殊化を含むマスターヘッダーファイルに配置しました。たとえば、RWCString用の特殊化は問題なく機能します。どういうわけか、テストケースが失敗するたびに、浮動小数点値(おそらくdouble、doubleの特殊化がCPPUnitに組み込まれている)として時間を出力するように要求されます-これが、to/fromを含めるようにした理由です上記の最小化されたコードの二重変換演算子。
私がしていることに本質的に何か問題がありますか?特殊化は、コンパイルプロセスの特定の時点で存在する必要がありますか?おそらく、その時点を見つけられなかったのでしょうか?この神話上のポイントは、翻訳単位ごとですか、それともプロジェクトごとですか?VS2008を使用しています。