2012-09-27 124 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行失敗,出現以下錯誤:

*** -[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> 

這是使用OCMock爲iOS。

爲什麼expect失敗時,模擬是mockForProtocol

+0

你是從源碼建立OCMock嗎?在'OCProtocolMockObject'的'methodSignatureForSelector:'方法中放置一個斷點會很有趣。 –

+0

不從源碼構建,只是下載了靜態庫。 – driis

+0

你可以發佈實際的協議聲明嗎? –

回答

2

這很好奇。我已經添加下面的類到iOS5的示例項目:

@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 

當我在Xcode 4.5版(4G182)對抗iPhone 6.0模擬器測試通過運行此。模擬對象的使用方式有什麼不同嗎?在你的情況下,_authenticationService傳遞到哪裏?收件人對此做了什麼?

+0

嗨艾瑞克,謝謝你的回答。我試圖在一個單獨的空測試項目中重現這一點,但我不能,因此我將不得不調查究竟是什麼觸發行爲。如果我找到任何東西,我會盡快回復您。僅供參考,錯誤發生在'expect'調用上,在模擬傳遞給我的任何一個測試代碼之前。 – driis

+0

@driis我試圖重現它,但不能。你使用的是哪個版本的OCMock? –

+0

@Erik我們如何獲得在委託方法調用期間傳遞的參數?就像在上面的例子中一樣,doStuff方法使用參數@「x」和@「y」調用authService方法。如何在測試用例中讀取@「x」和@「y」? –

相關問題