当我尝试在Visual Studio 2013中编译单元测试时,我收到以下错误:
错误1错误C2338:测试编写者必须定义ToString< Q * q>的特化。对于您的类类std :: basic_string< wchar_t,struct std :: char_traits< wchar_t&gt ;, class std :: allocator< wchar_t> > __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString< struct HINSTANCE __>(struct HINSTANCE__ *)。
您可以通过使用以下测试方法来复制错误:
const std::wstring moduleName = L"kernel32.dll";
const HMODULE expected = GetModuleHandle(moduleName.c_str());
Microsoft::VisualStudio::CppUnitTestFramework::Assert::AreEqual(expected, expected);
有谁知道我需要如何编写ToString
答案 0 :(得分:6)
我设法通过将以下代码添加到我的单元测试类文件来解决此问题:
/* ToString specialisation */
namespace Microsoft
{
namespace VisualStudio
{
namespace CppUnitTestFramework
{
template<> static std::wstring ToString<struct HINSTANCE__>
(struct HINSTANCE__ * t)
{
RETURN_WIDE_STRING(t);
}
}
}
}
我基于CppUnitTestAssert.h的内容(这是编译错误发生的地方 - 双击编译错误将为您打开此文件)。
靠近文件的顶部(如果双击上面提到的编译错误,只有几行),您可以看到一组ToString
模板。我复制了其中一行并将其粘贴到我的测试类文件中(包含在与原始模板相同的名称空间中)。
然后,我只是修改模板以匹配编译错误(特别是<struct HINSTANCE__>(struct HINSTANCE__ * t)
)。
对于我的方案,使用RETURN_WIDE_STRING(t)
足以显示我的AreSame
断言中的不匹配。根据使用的类型,您可以更进一步,并提取一些其他有意义的文本。
答案 1 :(得分:6)
比较类对象时遇到了同样的问题。 对我来说,我可以通过简单地写
来解决它Assert::IsTrue(bitmap1 == bitmap2);
而不是
Assert::AreEqual(bitmap1, bitmap2);
答案 2 :(得分:0)
截至 2021 年,Class Skeleton 提供的答案对我不起作用,但我基于它进行了一些修改并编译了以下内容。基本上,错误消息后面的几行提供了一些示例。
template<>
inline std::wstring __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString<MyClass>(const MyClass& t)
{
// replace with your own, here is just my example
// RETURN_WIDE_STRING(t.ToString().c_str());
}
将 MyClass
替换为您的班级。