0

我正在使用 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  

不知道我应该如何为枚举字符串创建模板专业化..

4

2 回答 2

3

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

这篇文章的最后,类似的问题得到了解决。

于 2020-02-07T17:06:49.523 回答
1

这很简单

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
于 2020-02-07T17:21:26.423 回答