2009-10-19 3 views
1

Google 그룹에서이 질문을했지만 여기서 더 빨리 응답 해 드리겠습니다.GoogleMock - Matchers 및 MFC ATL CString

Google's Mocking framework을 사용하여 코드를 테스트하려고합니다. 나는 그들의 test framework도 활용하고있다. 나는 VC9에서 컴파일하고있다. MFC \ ATL CString 인 인수와 일치하는 문제가 있습니다. GMock 은 개체가 같지 않으며 포인터 주소가 인 것으로 나타납니다. 내가 조롱을 시도하고있는 방법과 같이 구성되어있다 :

void myMethod(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)); 

: 내 기대를 설정할 때

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

나는 다음과 같은 비교를하고있는 중이 야 다음과 같은 matchers의 다양한 조합을 시도 :

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)); 

위의 호출 중 하나라도 동일한 결과가 나타납니다. 다른 사용자가 을이 문제로 돌리 시나요?

는 출력 :

구글 모의은 다음이 개 기대를했지만, 아무도 일치하지 :

: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)); 

... 모의 방법에 주어진 문자열이 실제로 (주소 확인) 당신이 기대하는 것, 그리고 사본 또는 다른 문자열 있는지 확인 것이다. 사전 통조림 매처 (matcher)는 CString 작동하지 않는 이유에 대해서는

, 나는 그것이 CString가 오버라이드 (override)하지 않기 때문에 하나 operator()== 또는 정규 구현은 CString에 대한 명시 적 전문성이없는 것으로 판단됩니다.

+0

"일부 값"은 'myMethod'의 상수입니다. 비교는 모의 (mock)를 제공하는 "Some Value"와 메소드에서 생성 된 "Some Value"사이의 비교입니다. 또한 CString은 operator() ==를 재정의하므로 Eq (v) 함수가 적어도 이것을 활용할 수 있다고 가정합니다. 의견을 보내 주셔서 감사합니다! –

+0

나는 본다. "Some Value"에 접근 할 수 없다면 함수의 입력 매개 변수에 대해 선택한 술어를 실행하는'ResultOf' 정규 표현식을 시도해 볼 수 있습니다. 그것은 문자열 매칭을 위해 과도한 것처럼 보이지만, 다른 matchers가 작동하지 않는 이유에 대한 단서를 제공 할 수 있습니다. –

0

다른 오류가 발생하여 종료되었습니다. 한숨 실제로 버그를 잡는 중 .... Google Mocks는 CString을 잘 비교할 수 있습니다.

관련 문제