我有一個應用程序,其中我推UIAlertController
與幾個自定義UIAlertAction
s。每個UIAlertAction
在處理器塊actionWithTitle:style:handler:
中執行獨特的任務。如何使用OCMock測試UIAlertAction處理程序的內容
我有幾個方法,我需要驗證在這些塊內執行。
如何執行handler
塊,以便我可以驗證這些方法是否已執行?
我有一個應用程序,其中我推UIAlertController
與幾個自定義UIAlertAction
s。每個UIAlertAction
在處理器塊actionWithTitle:style:handler:
中執行獨特的任務。如何使用OCMock測試UIAlertAction處理程序的內容
我有幾個方法,我需要驗證在這些塊內執行。
如何執行handler
塊,以便我可以驗證這些方法是否已執行?
經過一番玩耍,我終於搞清楚了。原來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];
}
帶着幾分聰明鑄造的,我已經找到了一種方法斯威夫特做到這一點(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)
,並有正確的處理程序執行。
(我只會用這個在我的測試目標中,順便說一句)
這在Swift 3.0.1中出現'致命錯誤:不能unsafeBitCast不同類型的不同大小之間',沒有人知道如何解決這個問題? –
我有[找到解決方案](http://stackoverflow.com/a/40634752/17294)。 –
任何想法什麼是正確的演員是在斯威夫特?只需轉換爲預期的函數類型即可在運行時提供「EXC_BAD_INSTRUCTION」。 –