【问题标题】:Compare enum types比较枚举类型
【发布时间】:2020-02-07 16:37:24
【问题描述】:

我正在使用 Visual Studio 的 cpp 单元测试框架实现一些单元测试。我希望能够在测试中比较枚举,但总是会出现错误。

这是导致我出错的代码。

ClauseEntities ent1 = varMap.at("a");
ClauseEntities ent2 = varMap.at("v");

Assert::AreEqual(ent1, ASSIGN_STATEMENT);
Assert::AreEqual(ent1, VARIABLE);

ent1 是一个枚举状态,而 ASSIGN_STATEMENT 也是来自同一枚举的一个枚举状态。

Severity    Code    Description Project File    Line    Suppression State
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<enum ClauseEntities>
(const enum ClauseEntities &).  
UnitTesting C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\VS\UnitTest\include\CppUnitTestAssert.h 66  

不确定我应该如何为枚举字符串创建模板特化..

【问题讨论】:

标签: c++ visual-studio enums microsoft-cpp-unit-test


【解决方案1】:

我从未使用过 microsoft cpp 单元测试,但从错误消息和 gtests 经验来看,我认为您必须为您的枚举类添加一个方法 ToString。 (我的猜测是)这是因为如果 Assert 失败,两个参数都会使用ToString 方法打印到某个输出。

this文章末尾类似问题已解决。

【讨论】:

    【解决方案2】:

    这很简单

    namespace Microsoft {
    namespace VisualStudio {
    namespace CppUnitTestFramework { // not sure if namespaces are actually needed
    
    std::wstring ToString(ClauseEntities value)
    {
        switch (value) {
        case ClauseEntities::ValueA: return L"ValueA"; //assuming that you are using enum class
        case ClauseEntities::ValueB: return L"ValueB";
        }
    
        return std::to_wstring(static_cast<int>(value));
    }
    
    } // namespace CppUnitTestFramework 
    } // namespace VisualStudio
    } // namespace Microsoft
    

    【讨论】:

    • 如果被比较的对象是自定义类型的对象而不是枚举怎么办?我试图让这个工作一整天,但没有任何运气。
    猜你喜欢
    • 2011-05-28
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2023-03-09
    • 2023-03-17
    相关资源
    最近更新 更多