如何使用块访问SenTestCase实现中的UIViewController委托方法?

时间:2013-09-12 08:26:34

标签: ios objective-c uiviewcontroller objective-c-blocks sentestingkit

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

0 个答案:

没有答案