先にテスト結果をお見せします。1つのテストに7秒もかかっているのは本当はかなりまずいんでしょうな・・・
やり方ですが、あらかじめViewControllerのStoryboard IDを設定しておきます。
(下の「use Storyboard ID」はUIの状態復元を行うとき必要な Restoration ID を Storyboard ID と同一にするものなので、状態復元を実装しないのなら意味を持たないそうです。uasiさんに教えてもらいました。ありがとうございました。)
以下はそのまま動作するコード。基本的な考え方としては、Storyboardクラスのインスタンスを作り、該当のViewControllerクラスのインスタンスを作ってから、テストを実施する。
テストの内容は、ViewControllerインスタンスに対してreloadWebView
メッセージを送った後、20秒以内にそのViewController上のWebViewからロード完了のメッセージがきちんと返ってきたらグリーン。
ViewControllerAsyncTest.m
#import <GHUnit/GHUnit.h>
#import "ViewController.h"
@interface ViewControllerAsyncTest : GHAsyncTestCase <UIWebViewDelegate>
@property ViewController *vc;
@end
@implementation ViewControllerAsyncTest
/*
下記メソッドを追加しないとView関連の処理がメインスレッドでおこなわれず、エラーとなる
*/
- (BOOL)shouldRunOnMainThread
{
return YES;
}
// 各々のテストが実行される前に呼ばれる
- (void)setUp
{
/*
ストーリーボードの初期化
ビューのオブジェクトを作るので、メインループで実行しなければならない
-(BOOL)shouldRunOnMainThreadでYESを返しておくこと
*/
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
GHAssertNotNil(storyboard, @"ストーリーボードが存在しない");
self.vc = [storyboard instantiateViewControllerWithIdentifier:@"hoge"]; // Storyboard ID
GHAssertNotNil(self.vc, @"ビューコントローラが存在しない");
[self.vc loadView];
/*
メインループで実行する別のやり方
*/
//[self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
}
/*
「計測開始」ボタンを押す
*/
- (void)testReloadWebView {
[self prepare];
self.vc.webView.delegate = self;
GHAssertNotNil(self.vc.webView, @"ウェブビューが存在しない");
[self.vc reloadWebView];
/*
成功の通知が来るまで待つ
タイムアウトは20秒
ストーリーボードを初期化するところから始めるので、けっこう時間がかかる
*/
[self waitForStatus:kGHUnitWaitStatusSuccess timeout:20.0/*sec*/];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testReloadWebView)];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
[self notify:kGHUnitWaitStatusFailure forSelector:@selector(testReloadWebView)];
}
@end
ブログやってます:weed software 開発者ブログ