1

この質問は Google グループで行いましたが、こちらの方が回答が早いと思います。

Google のモッキング フレームワークを使用してコードをテストしようとしています。私も彼らのテストフレームワークを利用しています。私は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 は次の 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

アダム

4

2 に答える 2

0

別のエラーになってしまいました。ため息実際にはバグをキャッチしていました.... Google Mocks は CString をうまく比較できます。

于 2009-10-19T19:31:04.703 に答える
0

メソッドに文字列が渡されるときに文字列のコピーを作成していないので、本当に値を確認する必要がありますか? 次の期待値を書くだけで十分です。

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

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

...これは、モックメソッドに与えられた文字列が実際にあなたが期待するもの (アドレスによって検証されたもの) であり、コピーやその他の文字列ではないことを確認します。

事前に用意されたマッチャーが で動作しない理由については、がオーバーライドされていないか、マッチャーの実装に の明示的な特殊化がないCStringためであると思われます。CStringoperator()==CString

于 2009-10-19T18:34:53.520 に答える