2016-04-28 75 views
3

我有一個應用程序,其中我推UIAlertController與幾個自定義UIAlertAction s。每個UIAlertAction在處理器塊actionWithTitle:style:handler:中執行獨特的任務。如何使用OCMock測試UIAlertAction處理程序的內容

我有幾個方法,我需要驗證在這些塊內執行。

如何執行handler塊,以便我可以驗證這些方法是否已執行?

回答

1

經過一番玩耍,我終於搞清楚了。原來handler塊可以轉換爲函數指針,並且可以執行函數指針。

像這樣

UIAlertAction *action = myAlertController.actions[0]; 
void (^someBlock)(id obj) = [action valueForKey:@"handler"]; 
someBlock(action); 

下面是它如何被使用的例子。

-(void)test_verifyThatIfUserSelectsTheFirstActionOfMyAlertControllerSomeMethodIsCalled { 

    //Setup expectations 
    [[_partialMockViewController expect] someMethod]; 

    //When the UIAlertController is presented automatically simulate a "tap" of the first button 
    [[_partialMockViewController stub] presentViewController:[OCMArg checkWithBlock:^BOOL(id obj) { 

     XCTAssert([obj isKindOfClass:[UIAlertController class]]); 

     UIAlertController *alert = (UIAlertController*)obj; 

     //Get the first button 
     UIAlertAction *action = alert.actions[0]; 

     //Cast the pointer of the handle block into a form that we can execute 
     void (^someBlock)(id obj) = [action valueForKey:@"handler"]; 

     //Execute the code of the join button 
     someBlock(action); 
    }] 
             animated:YES 
             completion:nil]; 

    //Execute the method that displays the UIAlertController 
    [_viewControllerUnderTest methodThatDisplaysAlertController]; 

    //Verify that |someMethod| was executed 
    [_partialMockViewController verify]; 
} 
+0

任何想法什麼是正確的演員是在斯威夫特?只需轉換爲預期的函數類型即可在運行時提供「EXC_BAD_INSTRUCTION」。 –

1

帶着幾分聰明鑄造的,我已經找到了一種方法斯威夫特做到這一點(2.2):

extension UIAlertController { 

    typealias AlertHandler = @convention(block) (UIAlertAction) -> Void 

    func tapButtonAtIndex(index: Int) { 
     let block = actions[index].valueForKey("handler") 
     let handler = unsafeBitCast(block, AlertHandler.self) 

     handler(actions[index]) 
    } 

} 

這使您可以調用測試alert.tapButtonAtIndex(1),並有正確的處理程序執行。

(我只會用這個在我的測試目標中,順便說一句)

+0

這在Swift 3.0.1中出現'致命錯誤:不能unsafeBitCast不同類型的不同大小之間',沒有人知道如何解決這個問題? –

+0

我有[找到解決方案](http://stackoverflow.com/a/40634752/17294)。 –

相關問題