0

我正在编写一些自动化测试来测试我的 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]];
    }
}
4

0 回答 0