错误 C2338:测试编写者必须为您的类定义 ToString<const Q& q> 的专业化

Kev*_*ude 9 unit-testing c++-cli visual-studio-2013

目前,我在 Visual Studio 2013 C++/CLI 本机单元测试中收到以下错误。

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 LTI::IPCommon::CPPBoxesBuffer>(const class LTI::IPCommon::CPPBoxesBuffer &).  c:\program files (x86)\microsoft visual studio 12.0\vc\unittest\include\cppunittestassert.h
Run Code Online (Sandbox Code Playgroud)

我已经尝试了 VS2012 中建议的解决方案:单元测试错误:Assert::AreEqual( object, object ) 不起作用并编写了专门化,但它不起作用。

这是 BoxesBuffer.h 中的类:

    class CPPBoxesBuffer{        
        private:
            unsigned char* _data;
            int _lines;

        public:
            CPPBoxesBuffer(unsigned char* data, int lines){ _data = data; _lines = lines; };

            // Methods for std::map. Class must be Assignable
            CPPBoxesBuffer(){ _data = nullptr; _lines = 0; };

            CPPBoxesBuffer(const CPPBoxesBuffer& other)
            {
                _lines = other._lines;
                _data = other._data;
            }

            CPPBoxesBuffer& operator=(const CPPBoxesBuffer& other)
            {
                _lines = other._lines;
                _data = other._data;
                return *this;
            }

            bool operator==(const CPPBoxesBuffer& other) const
            {
                return _lines == other._lines && _data == other._data;
            }


    };
Run Code Online (Sandbox Code Playgroud)

这是测试:

    TEST_METHOD(ShouldSetAndGetCppBoxesBufferData)
    {
        std::string key = "WhenPassingData";
        unsigned char t[5] = { 'a', 'b', 'c', 'd', 'e' };
        CPPBoxesBuffer data(t, 5);
        auto result = data;
        auto db = data == result; // This compiles.

        Assert::AreEqual(data, result);  // This fails with the error.
    }
Run Code Online (Sandbox Code Playgroud)

这是我写的专业:

#include "CppUnitTest.h"
#include "BoxesBuffer.h"

namespace Microsoft
{
    namespace VisualStudio
    {
        namespace CppUnitTestFramework
        {
            template<> static std::wstring ToString<CPPBoxesBuffer>(const class CPPBoxesBuffer& t) { return L"CppBoxesBuffer"; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Dav*_*Yaw 4

您的专业是否在线路Assert::AreEqual可以看到的地方声明?Assert::AreEqual我相信,如果它位于不同的 cpp 文件中并且未在标头中原型化,则在编译时将找不到它。