2009-10-19 64 views
1

我在Google Group上问过这个问题,但我想我会在这里得到更快的响应。GoogleMock - Matchers和MFC ATL CString

我正在尝试使用Google's Mocking framework来测试我的代码。我也在利用他们的test framework。我正在编译VC9。 我遇到的问题与MFC \ ATL CStrings的参数匹配。 GMock 表示对象不相等,它看起来是在对指针地址的 进行评估。我试图嘲弄的方法的结构 像这样:

void myMethod(const CString & key, const CString & value); 

这样的:

MOCK_METHOD2(myMethod, void(const CString & key , const CString & 
value); 

当设置我的期望,我在做以下比较:

CString szKey = _T("Some key"); 
CString szValue = _T("Some value"); 

EXPECT_CALL(myMock, myMethod(Eq(szKey), Eq(szValue))).WillOnce(Return 
(true)); 

我有尝试了许多不同的匹配器组合,例如:

EXPECT_CALL(myMock, myMethod(StrCaseEq(_T("Some Key")), StrCaseEq(_T 
(""Some value)))).WillOnce(Return(true)); 

EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey), 
TypedEq<const CString &>(szValue))).WillOnce(Return(true)); 


EXPECT_CALL(myMock, myMethod(TypedEq<const CString &>(szKey), 
TypedEq<const CString &>(szValue))).WillOnce(Return(true)); 

以上任何一个调用都产生了相同的结果。其他人运行 到这个问题?

这是输出:

谷歌模拟尝试了以下2点的预期,但没有匹配:

:80: tried expectation #0 
    Expected arg #1: is equal to 006D430C pointing to "Some value" 
      Actual: 4-byte object <A8EF 1102> 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 
:83: tried expectation #1 
    Expected arg #1: is equal to (ignoring case) "" 
      Actual: 4-byte object <A8EF 1102> 
    Expected arg #2: is equal to (ignoring case) "Some value" 
      Actual: 4-byte object <C0EE 1102> 
     Expected: to be called once 
      Actual: never called - unsatisfied and active 

亚当

回答

0

既然你时,他们都赚不到的字符串的副本传递给你的方法,你真的需要检查它们的值吗?它应该足以写入以下预期:

CString szKey = _T("Some key"); 
CString szValue = _T("Some value"); 

EXPECT_CALL(myMock, myMethod(szKey, szValue)).WillOnce(Return(true)); 

...这将检查给予模拟方法的字符串确实是你所期望的那些(由地址验证),而不是一个副本或其他字符串。

至于为什么预罐装的匹配不CString工作,我怀疑这可能是因为CString不会覆盖operator()==或匹配的实现没有一个明确的专业化为CString

+0

“有些价值”是'myMethod'中的一个常量。比较之间的比较是我提供的“一些价值”模拟和在该方法中产生的“一些价值”。此外,CString会覆盖运算符()==,所以我会假设Eq(v)函数至少可以利用它。感谢您的输入! – 2009-10-19 18:40:46

+0

我明白了。如果“Some Value”无法访问,那么您可能需要尝试'ResultOf'匹配器,它会根据函数的输入参数执行您选择的谓词。对于字符串匹配来说这似乎过分了,但可能会提供一些线索,说明其他匹配器不工作的原因。 – 2009-10-19 18:54:01

0

结束是一个不同的错误。 叹息这实际上是捕捉一个bug .... Google Mocks可以比较CStrings就好了。