読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

Visual Studio 2012 のネイティブ(C++)単体テストで、クラスなどのテストを行う

TFS

Visual Studio 2012 のネイティブC++単体テストで、こんな感じのクラス間のテストを書いた場合に、Asert::AreEqualで次のようなエラーがでます。

エラー 1 error C2676: 二項演算子 '==' : 'const Person' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。

これはAsert::AreEqualが==演算子を使っているためなので、Personの==演算子を実装します。

すると今度はまた違うエラーがでます。

エラー 1 error C2338: Test writer must define specialization of ToString<const Q& q> for your class class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<class Person>(const class Person &).

よくわからんので、エラーをダブルクリックしてみると、次のファイルに飛びます。

エラーを出力するための関数テンプレート「ToString」が必要で、基本的な型については特殊化されているのですが、ユーザー定義のクラスなどは特殊化されていないので、static_assertが呼ばれる「ToString」が呼ばれているようです。

ということで、「ToString」を実装すればよさそうです。「ToString」は、名前空間「namespace Microsoft{ namespace VisualStudio {namespace CppUnitTestFramework {」に実装されているので、これに合わせます(こっそり、Personのstd::stringをstd::wstringに変えました)。

これでテストを実施することができ、Assertに失敗した場合にはエラーの内容が表示されるようになりました。