【问题标题】:VS2012 : Error with unit test : Assert::AreEqual( object, object ) didn't workVS2012:单元测试出错:Assert::AreEqual(object, object) 不起作用
【发布时间】:2013-04-25 02:34:25
【问题描述】:

我在 VS 2012 上使用 Visual Studio Native Unit Test 时遇到一个奇怪的问题。 我有一个这样的坐标类:

#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:对不起,我的英语不是我的母语。

【问题讨论】:

    标签: c++ unit-testing visual-c++ visual-studio-2012


    【解决方案1】:

    创建赋值运算符后收到的错误,即

    错误 1 ​​错误 C2338:测试编写者必须为您的类定义 ToString 的特化 class 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.";
                }
    
            }
        }
    }
    

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

    【讨论】:

    • 你为什么要做模板函数专业化?为什么不直接使用函数重载?这种情况有什么意义?
    • 我不能告诉你。早在 2014 年,我对 C++ 的了解就更差了,从那时起我就没有真正接触过 Visual Studio。简单的重载可能会起作用。
    • 在这种情况下,它们都有效。我以前从未见过有人使用专门的函数模板。甚至没有意识到他们是可能的。但是查起来很有趣。不过,它们有一些意想不到的问题,这就是它们没有被大量使用的原因。
    • 现在是 2019 年,这仍然适用于 Visual Studio 2019。
    【解决方案2】:

    鉴于错误消息,您可以尝试让您的 operator== 对 const 更友好:

    bool operator==( const Coordinates coordinates ) const;
    

    【讨论】:

    • Error 1 error C2338: Test writer must defined specialization of ToString for your class class std::basic_string,class std::allocator > __cdecl Microsoft::VisualStudio::CppUnitTestFramework::ToString(const class Core::Coordinates &)。 c:\program 文件 (x86)\microsoft visual studio 11.0\vc\unittest\include\cppunittestassert.h 66 1 UnitTest1
    • 只是补充一点,对于不改变当前对象的任何方法/函数/运算符重载以及您不打算更改的任何参数都应该用 const 标记。跨度>
    • 除非有创建副本的理由,否则请使用bool operator == (const Coordinates &amp; coordinates) const
    • 'bool operator==( const Coordinates &coordinates ) const;'我试试这个,但我有同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    相关资源
    最近更新 更多