LoginSignup
6
7

More than 5 years have passed since last update.

StoryBoardを使ったiOSアプリをGHUnitでテストするには

Last updated at Posted at 2014-02-18

貼り付けた画像_2014_02_18_13_26.jpg

先にテスト結果をお見せします。1つのテストに7秒もかかっているのは本当はかなりまずいんでしょうな・・・

やり方ですが、あらかじめViewControllerのStoryboard IDを設定しておきます。
(下の「use Storyboard ID」はUIの状態復元を行うとき必要な Restoration ID を Storyboard ID と同一にするものなので、状態復元を実装しないのなら意味を持たないそうです。uasiさんに教えてもらいました。ありがとうございました。)

measure-power-p140204_xcworkspace_—_Main_iPhone_storyboard_と_下書きを作成・編集_-_Qiita.jpg

以下はそのまま動作するコード。基本的な考え方としては、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 開発者ブログ

6
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7