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

时间:2012-09-27 19:44:15

标签: c++ string unit-testing visual-c++ std

我正在尝试对某些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

它似乎与the following overload匹配:

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

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

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

4 个答案:

答案 0 :(得分:4)

您正在尝试将托管单元测试框架与 native 类型一起使用 - 如果不首先将对象编组为托管类型,这将无法正常工作。< / p>

VS2012现在附带native C++ unit testing framework;使用此框架代替,您的代码可以通过将"Unexpected Object Name"更改为宽字符串(前缀为L)并调用the following overload来实现:

template<typename T> 
static void AreEqual(
    const T& expected, 
    const T& actual, 
    const wchar_t* message = NULL, 
    const __LineInfo* pLineInfo = NULL)

答案 1 :(得分:3)

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

Assert::IsTrue(s1==s2)

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

答案 2 :(得分:1)

我修改了一些变通方法,以便比较整数而不是字符串:

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

将来,我们可能会转而使用本机C ++单元测试,但与此同时,这也是有用的。显然,这方面的消息传递不是很有帮助

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

但它总比没有好。

答案 3 :(得分: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