我正在编写一些自动化测试,用于测试我的根UIViewController
内发生的一些操作。截至目前,我正在使用SenTestCase
。我也在使用故事板。我怎样才能做到这一点?如何在视图控制器的UIWebView
上轻松监听委托方法?
我尝试过的是存储一个在Web视图加载完成后运行的块。
@interface FirstViewController : UIViewController
typedef void (^webViewDoneLoadingBlock)(void);
@property (nonatomic,strong) webViewDoneLoadingBlock doneLoading;
@end
我在第一个视图控制器的UIWebView
的委托方法中运行此块:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
self.doneLoading();
}
在setUp
中,我从故事板中取出第一个视图控制器:
- (void)setUp
{
[super setUp];
UIStoryboard *storyboard =
[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
UINavigationController *navController = [storyboard instantiateInitialViewController];
FirstViewController *firstVC = (id) navController.topViewController;
self.firstViewController = firstVC;
}
测试(我使用dispatchSemaphoreInBlock:
让测试等到调用thenResume
来说明测试是否失败):
- (void)testExample
{
[self dispatchSemaphoreInBlock:^(void (^thenResume)(void)) {
self.firstViewController.doneLoading = ^{
NSLog(@"done LOADING");
thenResume();
};
}];
}
点击self.doneLoading()时,EXC_BAD_ACCESS失败了;在webViewDidFinishLoad:
我在这里存放错误吗?或者还有另一种方法可以从FirstViewController
类继续使用SenTestCase
的委托方法吗?
调度信号量的代码(这是我通过许多其他项目使用的代码,所以我知道这不是它失败的原因):
- (void)dispatchSemaphoreInBlock:(void (^)(void (^resume)(void)))theBlock
{
dispatch_semaphore_t theSemaphore = dispatch_semaphore_create(0);
theBlock(^{
dispatch_semaphore_signal(theSemaphore);
});
while ( dispatch_semaphore_wait(theSemaphore, DISPATCH_TIME_NOW) ) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate distantFuture]];
}
}