我正在编写一些自动化测试来测试我的 root 内部发生的一些操作UIViewController
。截至目前,我正在使用SenTestCase
. 我也在使用故事板。我怎样才能做到这一点?以及如何轻松侦听视图控制器上的委托方法UIWebView
?
我尝试的是存储一个在 Web 视图完成加载其内容后运行的块。
@interface FirstViewController : UIViewController
typedef void (^webViewDoneLoadingBlock)(void);
@property (nonatomic,strong) webViewDoneLoadingBlock doneLoading;
@end
我在 First view controller 的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]];
}
}