2013-05-01 79 views
7

我在VS 2012上使用Visual Studio Native Unit Test时遇到了一个奇怪的问题。 我有一个坐标类这样的:VS2012:单元测试错误:Assert :: AreEqual(object,object)不起作用

#ifndef COORDINATES_HPP 
#define COORDINATES_HPP 

#include <iostream> 

namespace Core { 
class Coordinates { 
public: 
    Coordinates(); 
    Coordinates(int x, int y); 
    Coordinates(const Coordinates &copy); 
    ~Coordinates(); 

    void operator=(Coordinates coordinates); 
    void operator+=(Coordinates coordinates); 
    void operator-=(Coordinates coordinates); 
    Coordinates operator+(Coordinates coordinates); 
    Coordinates operator-(Coordinates coordinates); 
    bool operator==(Coordinates coordinates); 
    bool operator!=(Coordinates coordinates); 

    int getX() const { return m_x; } 
    int getY() const { return m_y; } 
    void setX(const int &val) { m_x = val; } 
    void setY(const int &val) { m_y = val; } 

protected: 
    int m_x, m_y; 
}; 
} 

所以,当我使用的问题出现: 断言:: AreEqual(坐标为(0,0),(0,0));

发送的错误是: 错误1错误C2678:二进制'==':找不到操作符找到类型为'const Core :: Coordinates'的左手操作数(或者没有可接受的转换)c: \ program files(x86)\ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h 129 1 UnitTest1

你有解决这个问题的想法吗?

PS:对不起,我的英语,不是我的母语。

回答

0

由于错误信息,你可以尝试让你的操作更加==常量友好:创建赋值运算符后收到

bool operator==(const Coordinates coordinates) const; 
+0

错误错误C2338:测试作家必须定义的ToString 专业化为你的类类的std :: basic_string的,一流的std ::分配器> __cdecl微软的VisualStudio :: :: CppUnitTestFramework :: ToString (const class Core :: Coordinates&)。 \t C:\ program files(x86)\ microsoft visual studio 11.0 \ vc \ unittest \ include \ cppunittestassert.h 1单元测试1 – Winter 2013-05-01 03:47:55

+0

只是为了补充说明,对于任何不改变的方法/函数/运算符重载当前对象和任何你不打算改变的参数应该用一个const标记。 – 2013-05-01 03:48:39

+0

除非有理由创建副本,否则请使用'bool operator ==(const Coordinates&coordinates)const' – Mordachai 2013-05-01 03:54:43

16

错误,即

错误1错误C2338:测试编写者必须为你的类类定义ToString的专用化std :: basic_string,class std :: allocator> __cdecl Microsoft :: VisualStudio :: CppUnitTestFramework :: ToString(const class Core :: Coordinates &)。

与需要为单元测试提供打印出预期和收到的值的方法有关。您可以通过在名称空间Microsoft::VisualStudio::CppUnitTestFramework中创建ToString函数的模板特化来完成此操作。例如:

namespace Microsoft{ 
    namespace VisualStudio { 
     namespace CppUnitTestFramework { 

      template<> 
      static std::wstring ToString<Coordinates>(const Coordinates & coord) { 
       return L"Some string representing coordinate."; 
      } 

     } 
    } 
} 

之后,单元测试应该运行。

+0

你为什么要做模板功能专业化?为什么不使用函数超载?这种情况下的意义何在? – Adrian 2017-10-05 19:30:40

+0

我无法告诉你。我对C++的了解在2014年有所恶化,从那时起我就没有真正接触过Visual Studio。这可能是简单的超负荷工作。 – Gage 2017-10-14 08:56:55

+0

在这种情况下,他们都工作。我刚才没有见过任何人使用过专门的函数模板。甚至没有意识到它们是可能的。但看起来很有趣。虽然他们有一些意想不到的问题,这就是为什么他们没有太多用处。 – Adrian 2017-10-14 22:30:50

相关问题