C2338编译错误的Microsoft Visual Studio单元测试

时间:2015-02-26 10:24:06

标签: c++ windows unit-testing visual-studio-2013 vs-unit-testing-framework

当我尝试在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

这样的专业化

3 个答案:

答案 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 替换为您的班级。