2009-10-19 39 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就好了。