2012-09-27 11 views
8

この(loginWithEmail法がよく、期待として期待されます)動作コード、検討:このコード対OCMock、プロトコル上でメソッドを期待できないのはなぜですか?

_authenticationService = [[OCMockObject mockForClass:[AuthenticationService class]] retain]; 
[[_authenticationService expect] loginWithEmail:[OCMArg any] andPassword:[OCMArg any]]; 

_authenticationService = [[OCMockObject mockForProtocol:@protocol(AuthenticationServiceProtocol)] retain]; 
[[_authenticationService expect] loginWithEmail:[OCMArg any] andPassword:[OCMArg any]]; 

2番目のコード例は、次の行2に失敗エラー:

*** -[NSProxy doesNotRecognizeSelector:loginWithEmail:andPassword:] called! Unknown.m:0: error: -[MigratorTest methodRedacted] : *** 
-[NSProxy doesNotRecognizeSelector:loginWithEmail:andPassword:] called! 

AuthenticationServiceProtocolは、メソッドを宣言します

@protocol AuthenticationServiceProtocol <NSObject> 
@property (nonatomic, retain) id<AuthenticationDelegate> authenticationDelegate; 

- (void)loginWithEmail:(NSString *)email andPassword:(NSString *)password; 
- (void)logout; 
- (void)refreshToken; 

@end 

そして、それはクラスで実装されています

@interface AuthenticationService : NSObject <AuthenticationServiceProtocol> 

これは、iOS用OCMockを使用しています。

モックがmockForProtocolのときにexpectが失敗するのはなぜですか?

+0

ソースからOCMockを構築していますか? 'OCProtocolMockObject'の' methodSignatureForSelector: 'メソッドにブレークポイントを入れることは興味深いでしょう。 –

+0

ソースからビルドしていない、ちょうど静的ライブラリをダウンロードしました。 – driis

+0

実際のプロトコル宣言を投稿できますか? –

答えて

2

これは好奇心です。私はiPhone 6.0シミュレータに対するXcodeのバージョン4.5(4G182)でこれを実行すると、テストに合格

@protocol AuthenticationServiceProtocol 

- (void)loginWithEmail:(NSString *)email andPassword:(NSString *)password; 

@end 

@interface Foo : NSObject 
{ 
    id<AuthenticationServiceProtocol> authService; 
} 

- (id)initWithAuthenticationService:(id<AuthenticationServiceProtocol>)anAuthService; 
- (void)doStuff; 

@end 

@implementation Foo 

- (id)initWithAuthenticationService:(id<AuthenticationServiceProtocol>)anAuthService 
{ 
    self = [super init]; 
    authService = anAuthService; 
    return self; 
} 

- (void)doStuff 
{ 
    [authService loginWithEmail:@"x" andPassword:@"y"]; 
} 

@end 

@implementation ProtocolTests 

- (void)testTheProtocol 
{ 
    id authService = [OCMockObject mockForProtocol:@protocol(AuthenticationServiceProtocol)]; 
    id foo = [[Foo alloc] initWithAuthenticationService:authService]; 

    [[authService expect] loginWithEmail:[OCMArg any] andPassword:[OCMArg any]]; 

    [foo doStuff]; 

    [authService verify]; 
} 

@end 

:私はiOS5をサンプルプロジェクトに以下のクラスが追加されました。モックオブジェクトの使い方に違いはありますか?あなたの場合、_authenticationServiceはどこに渡されますか?受信者は何をしていますか?

+0

私はこれを別の空のテストプロジェクトで再現しようとしましたが、できません。そのため、何がその動作を引き起こすのかを正確に調べなければなりません。私が何かを見つけたら、私はあなたに戻ってきます。参考までに、mockがテスト中のコードのいずれかに渡される前に、 'expect'コールでエラーが発生します。 – driis

+0

@driis私もそれを再現しようとしましたが、できませんでした。どのバージョンのOCMockを使用していますか? –

+0

@Erikデリゲートメソッドコール中に渡された引数を取得するにはどうすればよいですか?上記の場合と同様に、doStuffメソッドは@ "x"と@ "y"という引数を持つauthServiceメソッドを呼び出しています。テストケースで@ "x"と@ "y"はどのように読むことができますか? –

関連する問題