1

私はこのようなことをしようとしています:

id synchronizerDelegate = [OCMockObject mockForProtocol:@protocol(SynchronizerDelegate)];
BOOL isRespondsToSelector = NO;
[[[synchronizerDelegate stub] andReturnValue:OCMOCK_VALUE(isRespondsToSelector)] respondsToSelector:@selector(didLoadFullImage:)];
GHAssertFalse([synchronizerDelegate respondsToSelector:@selector(didLoadFullImage:)], nil);

SynchronizerDelegateの定義は次のとおりです

@protocol SynchronizerDelegate <NSObject>
- (void)didLoadFullImage:(NSData *)data;
@end

ただし、このテストケースは常に失敗します(戻り値はYESです)。

以前に「respondsToSelector」メソッドをスタブしようとした人はいますか?

4

2 に答える 2

2

mockForProtocolを実行すると、モックは実際にはプロトコルに準拠していないため、OCProtocolMockObjectオーバーライドrespondsToSelectorして、プロトコルで定義されたメソッドに対してYESを返します。

OCMockはforwardInvocation:、オブジェクトが呼び出されるメソッドを定義していないときにランタイムによって呼び出されるに依存します。OCProtocolMockObjectを実装しているのでrespondsToSelector、それをあざけることはできません。

達成しようとしていることを説明する場合、それにアプローチする別の方法があるかもしれません。

于 2012-06-19T17:12:18.800 に答える
0

この質問は古いですが、システム機能(iOS 8の新しいローカリゼーション権限など)を確認するためにこれを行うときに、両方のコードパス(セレクターに応答し、応答しない)をテストする方法を実際に見つけました。

これは私の仕様です:

it(@"asks for location permission on viewDidLoad", ^{

    id locationManagerMock = OCMClassMock([CLLocationManager class]);

    if([locationManagerMock respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [[locationManagerMock expect] requestWhenInUseAuthorization];
    }
    else {
        [[locationManagerMock expect] startUpdatingLocation];
    }

    [sut setLocationManager:locationManagerMock];
    [sut view];

    [locationManagerMock verify];

});
于 2014-12-11T11:31:44.623 に答える