0

root 内で発生するいくつかのアクションをテストする自動テストをいくつか書いていますUIViewController。今のところ私は使用してSenTestCaseいます。ストーリーボードも使用しています。これどうやってするの?また、View Controller のデリゲート メソッドを簡単にリッスンするにはどうすればよい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]];
    }
}
4

0 に答える 0