1

iOS プロジェクトの単体テストに OCHamcrest と OCMockito を使用しています。パラメータを取るメソッドの期待値の模擬検証でカスタム マッチャーを使用して理解を深めようとしています。特に、予期されるメソッドに渡されたパラメーターの 1 つを確認したいのですが、そのためには渡されたパラメーターを引き離す必要があります。実証するために、テストメソッドの関連部分について私が持っているものは次のとおりです。

EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController = 
    mockObjectAndProtocol(
        [UIViewController class], @protocol(ZKSearchManagerDelegate)
    );
[verify(mockController) 
        zkZSensorFound:isSensorWithAccessory(accessory) 
     fromSearchManager:_sm];

-zkZSensorFound:fromSearchManager:、 を含むオブジェクトをEAAccessoryプロパティとして受け取ります。accessoryカスタム マッチャーで、そのオブジェクトを開いてそのプロパティを調べ、このテスト メソッド内のオブジェクトと同じであることを確認する必要があります。ここで行っているようにマッチャーに渡すのは簡単accessoryですが、マッチャー内で使用するためにパラメーターに渡される実際のオブジェクトを取得するにはどうすればよいでしょうか? それとも、私はこれについてすべて間違っていますか?

アップデート

@JonReid からの回答を受け入れました。これは、私が作成したものよりもはるかにエレガントなソリューションです。それにもかかわらず、私が使用していたもの (このブログ投稿のおかげで) は、他の場所で役立つ可能性があると思います:

#import "ArgumentCaptor.h"

EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController = 
    mockObjectAndProtocol(
        [UIViewController class], @protocol(ZKSearchManagerDelegate)
    );
ArgumentCaptor *captor = argCaptor();
[verify(_mockController) zkZSensorFound:(ZKZSensor *)captor 
                      fromSearchManager:is(sameInstance(_sm))];
ZKZSensor *sensor = captor.argument;
assertThat(sensor.accessory, is(_mockAccessory));
4

1 に答える 1

1

まず、OCMockito にマッチャーを指定しないと、マッチャーが使用されることに注意してくださいisEqual。これはおそらく、2 番目の引数で確認したいことではありません。代わりに身元を確認します:

fromSearchManager:sameInstance(_sm)

sameInstance引数が入力されている場合、マッチャーが検索マネージャーではないことを訴えます。回避策は、マッチャーをキャストしてタイピングを削除することです。

fromSearchManager:(id)sameInstance(_sm)

最初の引数については、カスタムマッチャーを作成する必要がまったくない場合があります。プロパティ値を確認するだけの場合は、 を使用しますhasProperty。プロパティの名前が であると仮定するとaccessory

zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))

すべてを一緒に入れて:

[verify(mockController) 
        zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory)) 
     fromSearchManager:(id)sameInstance(_sm)];
于 2013-01-18T23:13:49.650 に答える