为什么VS UnitTesting框架中的Assert :: AreEqual不能与std :: string一起使用?

sgr*_*zko 7 c++ string unit-testing std visual-c++

我试图对一些c ++代码进行单元测试,但遇到了一些麻烦.

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

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

而且我得到以下编译器错误...

error C2665: 'Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual' :
none of the 15 overloads could convert all the argument types
Run Code Online (Sandbox Code Playgroud)

看起来它应该与以下重载匹配:

AreEqual<(Of <(T>)>)(T, T, String) 
Run Code Online (Sandbox Code Playgroud)

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

还有其他方法可以实现此断言吗?

sgr*_*zko 1

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

Assert::AreEqual(0, s1.compare(s2), "Unexpected Object Name");
Run Code Online (Sandbox Code Playgroud)

将来,我们可能会切换到本机 C++ 单元测试,但与此同时,这确实有效。显然,这方面的消息传递不是很有帮助

Assert.AreEqual failed. Expected:<0>. Actual:<1>. Unexpected Trajectory Name
Run Code Online (Sandbox Code Playgroud)

但总比没有好。

  • 另一种解决方法(仅适用于字符串,无需额外工作)是使用[内置封送处理库](http://msdn.microsoft.com/en-us/library/bb384865(VS.100).aspx): Assert::AreEqual(marshal_as&lt;String^&gt;(s1), marshal_as&lt;String^&gt;(s2), L"意外的对象名称");`。+1不过,我认为你的解决方法很有创意。:-] (2认同)