2

我收到以下错误,当我试图在Visual Studio 2013来编译单元测试:C2338编译错误对Microsoft Visual Studio的单元测试

错误1个错误C2338:测试作家必须定义的ToString专业化< q * q >为你的类类的std :: basic_string的< wchar_t的,结构的std :: char_traits < wchar_t的>,一流的std ::分配器< wchar_t的> > _ _ CDECL微软的VisualStudio :: :: CppUnitTestFramework ::的ToString <结构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这样的专业化:

可以由具有试验方法如下面复制错误?

回答

5

我设法通过将下面的代码到我的单元测试类文件来解决问题:

/* 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声明中的不匹配。根据所使用的类型,您可以进一步提取其他有意义的文本。

3

我在比较类对象时遇到同样的问题。 对我来说,我可以简单地写

Assert::IsTrue(bitmap1 == bitmap2); 

,而不是

Assert::AreEqual(bitmap1, bitmap2); 
解决问题