2014-03-12 89 views
3

我想模擬一個類方法,該方法可以識別iOS是iOS 6(或更早版本)還是iOS 7(或更高版本)。下面是測試代碼:OCMock類方法不工作

id iOSDetectorMock = [OCMockObject mockForClass:[UTiOSVersionDetector class]]; 
[[[iOSDetectorMock stub] andReturnValue:@(YES)] isIOS6_Earlier]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.homeViewController]; 
[self.homeViewController loadView]; 
[self.homeViewController viewDidLoad]; 
XCTAssertTrue([self.homeViewController.navigationController.navigationBar.tintColor isEqual:Color_Dark_Green], @"Navigation bar tint color is not correct"); 
[iOSDetectorMock stopMocking]; 
navController = nil; 

然而,在返回NO忽略我用模擬isIOS6_Earlier保持方法。的UTiOSVersionDetector原代碼如下:

+ (BOOL) isIOS6_Earlier { 

if ([[[UIDevice currentDevice] systemVersion] intValue] <= 6) { 
    return YES; 
} 

return NO; 

} 

編輯:我上的Xcode 5.1測試,但它存在於Xcode的5.0.2了。

+0

使用提供的'OCMOCK_VALUE()'宏是否會產生更好的結果?宏創建一個'NSValue',它與你傳遞的'NSNumber'不同。 –

+0

結果相同,沒有區別。 –

+0

這應該起作用。在你發佈的代碼中,不清楚控制器是如何創建的。在創建存根之前,他們是否有可能調用'isIO6_earlier'方法? –

回答

3

也許嘗試,使之更加明確:

[[[[iOSDetectorMock stub] classMethod] andReturnValue:@YES] isIOS6_Earlier]; 

由於上ocmock.org/features描述,它可以在某些情況下是有益的。