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]];
}
}