2013-12-19 18 views
2

傳遞塊我有一個處理我所有的網絡通信這樣一類:OCMock一個類的方法回調含自定義數據

typedef void (^ networkEndblock) (NSArray *, NSError *); 

@interface NetworkAPI : NetworkBase 

+ (void) doSomeNetworkAcion:(networkEndblock) endBlock; 

@end 

我用上面這樣的代碼(我不想進入這裏不相關的細節)

- (void) runMyProcess:(SomeEndBlock)proccesEnded{ 

    // Bussiness logic 


    // Get Data from the web 
    [NetworkAPI doSomeNetworkAcion:^(NSArray *resultArray, NSError *error){ 

    // Check for error. if we have error then do error handling 
    // If no error, check for array. 
    // If array is empty then go to code that handles empty array 
    // else Process data         

    }]; 
} 

在我的測試方法,我想觸發runMyProcess測試,我不希望它去,打網絡,我想控制和設置的情況下,使其返回錯誤,空陣列等等。我知道如何使用SenTest,它是MACROS,但我不知道如何僞造我的網絡API。

我看着存根和期待,但我弄糊塗了,如果我可以做我想做的。

由於

回答

5

類模擬[NetworkAPI doSomeNetworkAction:]並使用andDo塊。

// This is in the OCMock project but is really useful 
#import "NSInvocation+OCMAdditions.h" 

// Whatever you want for these values 
NSArray *fakeResultArray; 
NSError *fakeError; 

id networkAPIMock = [OCMockObject mockForClass:NetworkAPI.class]; 
[[[networkAPIMock expect] andDo:^(NSInvocation *invocation) { 
    networkEndBlock endBlock = [invocation getArgumentAtIndexAsObject:2]; 
    endBlock(fakeResultArray, fakeError); 
}] doSomeNetworkAction:OCMOCK_ANY]; 

另外,我想在我的typedef利用NetworkEndBlock,因爲它會使你的代碼更容易閱讀別人。

+0

工作正常iOS 7,我不得不添加NSInvocation + OCMAdditions.h,但在iOS 6.1崩潰,任何想法? – user2708681

+0

很難說。 EndBlock中是否存在與iOS6不兼容的東西?崩潰日誌說什麼? –