Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

貼り付けた画像_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 開発者ブログ

Feel-Physics
今はHoloLensのアプリを開発しており、技術記事はすべてブログ( http://weed.nagoya )に書いています。以前はSwift、OpenCV+Python、JavaScript、Objective-Cを書いていました。
http://feel-physics.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away