c++ GoogleMock -匹配器和MFC\ATL CString

20jt8wwn  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(148)

我在谷歌小组上问了这个问题,但我想我会在这里得到更快的回应。
我尝试使用Google's Mocking framework来测试我的代码。我也在使用他们的test framework。我在VC9中编译。我在匹配MFC\ATL CString的参数时遇到了问题。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));

以上任何一个调用都产生了相同的结果。还有人遇到过这个问题吗?
以下是输出:
Google Mock尝试了以下两种预期,但都不匹配:

: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

亚当

g2ieeal7

g2ieeal71#

既然在字符串传递给方法时并没有复制它们,那么你真的需要检查它们的值吗?写下面的期望就足够了:

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

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

...它将检查提供给mock方法的字符串是否确实是您所期望的(通过地址验证),而不是副本或其他字符串。
关于预封装的匹配器不能与CString一起工作的原因,我怀疑要么是因为CString没有覆盖operator()==,要么是因为匹配器实现没有CString的显式专用化。

o2g1uqev

o2g1uqev2#

结果是一个不同的错误。* 叹息 * 它实际上是抓住了一个错误....谷歌模拟可以比较cstring刚刚好。

相关问题