2017-07-03 36 views
0

Stubbing方法很好地適用於'NSUserDefaults',但它似乎不適用於我的自定義方法。Stubbing方法不適用於OCMock3.4

我的測試代碼如下:在的ViewController

- (void)testExample 
{ 
    id userDefaultMock = OCMClassMock([NSUserDefaults class]); 
    OCMStub([userDefaultMock standardUserDefaults]).andReturn(userDefaultMock); 
    OCMStub([userDefaultMock objectForKey:[OCMArg any]]).andReturn(@"user defaults mock obj"); 


    id managerMock = OCMClassMock([ViewManager class]); 
    OCMStub([managerMock sharedInstance]).andReturn(managerMock); 
    OCMStub([managerMock generateObjWithObj:[OCMArg any]]).andReturn(@(11)); 

    ViewController *vc = [[ViewController alloc]init]; 
    [vc publicMethod]; 

} 

代碼:在ViewManager

- (void)publicMethod 
{ 
    [[NSUserDefaults standardUserDefaults]setObject:@"mockObj" forKey:@"mockObjKey"]; 
    id obj = [[NSUserDefaults standardUserDefaults]objectForKey:@"mockObjKey"]; 
    NSLog(@"mockObjKey:%@",obj); 

    NSNumber *num = @(0); 
    NSNumber *i = [[ViewManager sharedInstance] generateIndexWithNumber:num]; 
    NSLog(@"i expected to be 1, actual :%ld",i.integerValue); 
} 

代碼:

static ViewManager *sharedViewManager = nil; 

+ (id)sharedInstance 
{ 
    if (nil == sharedViewManager) 
    { 
     sharedViewManager = [[ViewManager alloc]init]; 
    } 
    return sharedViewManager; 
} 
- (NSNumber *)generateIndexWithNumber:(NSNumber *)index 
{ 
    NSLog(@"generateIndexWithNumber:%ld",index.integerValue); 
    return @(index.integerValue + 1); 
} 

和控制檯輸出如下:

2017-07-03 10:12:25.812 OC_Unit[2214:64454] mockObjKey:user defaults mock obj 
2017-07-03 10:12:25.812 OC_Unit[2214:64454] generateIndexWithNumber:0 
2017-07-03 10:12:25.812 OC_Unit[2214:64454] i expected to be 1, actual :1 

如果shubbing方法有效,最後一行輸出應該是'我預計爲1,實際:11'。我想知道,它爲什麼不按預期輸出。

回答

1

它看起來像你是st generateObjWithObj:但代碼調用generateIndexWithNumber:

+0

非常感謝。 ([managerMock generateObjWithObj:[OCMArg any]])andReturn(@(11));'-testExample'中的''應該被'OCMStub([managerMock generateIndexWithNumber :[OCMArg any]])。和返回(@(11));'。因此,我實際上將'generateIndexWithNumber:'剪除了。 – Emalwb

+0

經過測試,我發現'-publicMethod'中的[ViewManager sharedInstance]不會被'managerMock'取代。如果在'-testExample'中調用了'[ViewManager sharedInstance]',則發生替換。這意味着我必須顯式地用'managerMock'替換'ViewManager'中的'sharedViewManager',以確保存根自定義方法正常工作。這是否符合你的設計?或者還有其他方法可以解決我的問題嗎?最好的祝福! – Emalwb

+0

我能想到的唯一事情就是一個鏈接問題。使用CocoaPods,或者只是Xcode中的目標成員資格不正確,可以創建一個包含兩次測試類的設置。對'ViewManager'的引用實際上是指類的兩個*分開的* *副本。然後,測試代碼使用一個併爲其創建一個存根,但被測試的代碼鏈接不同,它使用該類的不同副本。你可以嘗試從測試和'publicMethod'打印指向類的指針嗎? –

相關問題