31

OCMock を使用して iPhone のプロジェクトをテストする方法を学習しています。このシナリオがあります。getHeightAtX:andY:メソッドを使用する HeightMap クラスと、 HeightMap. HeightMapいくつかのモックを使用して Render を単体テストしようとしています。これは機能します:

id mock = [OCMockObject mockForClass:[Chunk class]];
int h = 0;
[[[mock stub] andReturnValue:OCMOCK_VALUE(h)] getHeightAtX:0 andY:0];

もちろん、x=0と でのみ機能しy=0ます。「フラットな」高さマップを使用してテストしたい。これは、次のようなことをする必要があることを意味します。

id chunk = [OCMockObject mockForClass:[Chunk class]];
int h = 0;
[[[chunk stub] andReturnValue:OCMOCK_VALUE(h)] getHeightAtX:[OCMArg any] andY:[OCMArg any]];

ただし、これにより 2 つのコンパイル警告が発生します。

警告: の引数 1 を渡すと'getHeightAtX:andY:'、キャストなしでポインタから整数になります

および実行時エラー:

予期しないメソッドが呼び出されました:'getHeightAtX:0 andY:0 stubbed: getHeightAtX:15545040 andY:15545024'

私は何が欠けていますか?anyValueこのモックにa を渡す方法が見つかりませんでした。

4

6 に答える 6

50

この質問が出されてからしばらく経ちましたが、私は自分でこの問題に遭遇し、どこにも解決策を見つけることができませんでした. OCMock がサポートignoringNonObjectArgsされるようになったため、例は次のようにexpectなります。

[[[mockObject expect] ignoringNonObjectArgs] someMethodWithPrimitiveArgument:5];

5 は実際には何もしません。単なるフィラー値です。

于 2013-11-08T01:00:27.157 に答える
18

OCMock は現在、プリミティブ引数の緩やかな一致をサポートしていません。OCMock フォーラムで、これをサポートするための潜在的な変更についての議論がありますが、行き詰まっているようです。

私が見つけた唯一の解決策は、渡されるプリミティブ値を知っているような方法でテストを構築することですが、それは理想からはほど遠いものです。

于 2011-06-13T14:47:09.277 に答える
1

Andrew Parkの回答に加えて、もう少し一般的で見栄えの良いものにすることができます:

#define OCMStubIgnoringNonObjectArgs(invocation) \
({ \
    _OCMSilenceWarnings( \
        [OCMMacroState beginStubMacro]; \
        [[[OCMMacroState globalState] recorder] ignoringNonObjectArgs]; \
        invocation; \
        [OCMMacroState endStubMacro]; \
    ); \
})

次のように使用できます。

OCMStubIgnoringNonObjectArgs(someMethodParam:0 param2:0).andDo(someBlock)

期待する場合も同じことができます。このケースは、トピック スターター リクエストとしてスタブ化するためのものです。OCMock 3.1.1 でテスト済みです。

于 2014-12-18T00:31:27.787 に答える