9

我正在尝试对一些 c++ 代码进行单元测试,但遇到了一些麻烦。

我有类似于以下代码行的东西......

std::string s1 = obj->getName();
std::string s2 = "ExpectedName";
Assert::AreEqual(s1, s2, "Unexpected Object Name");

我收到以下编译器错误...

error C2665: 'Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual' :
none of the 15 overloads could convert all the argument types

似乎它应该与以下重载匹配:

AreEqual<(Of <(T>)>)(T, T, String) 

上面的重载不是应该支持任何对象的模板重载吗,只要参数 1 和 2 是相同的类型?还是我错过了什么?

还有其他方法可以完成此断言吗?

4

4 回答 4

4

您正在尝试将托管单元测试框架与本机类型一起使用——如果不先将对象编组为托管类型,这根本行不通。

VS2012 现在自带原生 C++ 单元测试框架;改用此框架,您的代码可以通过更改"Unexpected Object Name"为宽字符串(前缀为L)并调用以下重载来工作:

template<typename T> 
static void AreEqual(
    const T& expected, 
    const T& actual, 
    const wchar_t* message = NULL, 
    const __LineInfo* pLineInfo = NULL)
于 2012-09-27T20:01:26.267 回答
4

如果我们试图留在非托管 C++ 中,并且我们不在乎错误消息的样子,那么这可能是比接受的答案更好的选择:

Assert::IsTrue(s1==s2)

更好,我的意思是它至少易于阅读。

于 2014-05-04T21:13:36.093 回答
1

我破解了一些解决方法,以便比较整数而不是字符串:

Assert::AreEqual(0, s1.compare(s2), "Unexpected Object Name");

将来,我们可能会切换到原生 C++ 单元测试,但与此同时,这可以解决问题。显然,这个消息不是很有帮助

Assert.AreEqual failed. Expected:<0>. Actual:<1>. Unexpected Trajectory Name

但总比没有好。

于 2012-09-27T20:47:10.130 回答
1

我相信解决方案是在字符串之前给我们 L 前缀

      Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), L"Empty");

您也可以尝试这样的案例,这会给您错误的结果,但会导致对问题的正确理解方向

   Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), (wchar_t*)"Empty"); //Empty
   Assert::AreEqual(true, dict->IsBeginWith("A", "A"), (wchar_t*)"Empty2");
   Assert::AreEqual(true, dict->IsBeginWith("A", "a"), (wchar_t*)""); //CAPITAL LETTER Check
于 2017-07-11T09:55:15.367 回答