LoginSignup
5
2

More than 5 years have passed since last update.

Swift3.0でUTを書く ~Manual Mocking~

Last updated at Posted at 2017-03-24

UTの作成準備

Objective-CクラスをSwiftでテストコードを作成する場合

  1. AppTestsファイルに新規で「Unit Test Case Class」ファイルを追加する。

    • サブクラス:XCTestCaseになっていることを確認
    • Language:Swiftにする TargetはAppTestsのみにチェックを入れる (ここで余計なファイルにチェックすると「Cannot load underlying module for ‘XCTest’」のコンパイルエラーが起こる。。。)
  2. Objective-C Bridging Headerを作成する。以下のダイアログが出たら「YES」を選ぶと自動で作ってくれる。
    (AppTestsのBuildSettingのSwift Compiler - GeneralのObjective-C Generated Interface Header Name にも自動的に登録される)

       1 bridge-alert.png

  3. Bridging HeaderファイルにSwiftのUTクラスで利用したいObjective-Cクラスのimportを記述する。
    (今回はAppTests-Bridging-Header.hという名前で作成)

    AppTests-Bridging-Header.h
    #ifndef App_Bridging_Header_h
    #define App_Bridging_Header_h
    
    // Swiftのテストクラスで使いたいObj-CクラスのHeaderを記述する
    #import "App.h"
    #import "AppSetting.h"
    #endif
    
  4. 作成したUTクラスに「import XCTest」があることを確認する。

SwiftクラスをSwiftでテストコードを作成する場合

  1. プロジェクトファイル .xcodeproj の "Defines Module" を YES に設定。→ Xcodeで対象のプロジェクトを開き、Build SettingsのDefines Modulesを "YES"にする
  2. 各テストクラスで @testable import YourAppModuleName を追記する。

Manual Mocking

Manual Mockingとは・・・

  • Swiftでテストコードを書く場合のスタブ・モック作成が可能、(Obj-CクラスのテストをSwiftで書くときにも使用可)
  • Xcodeに標準装備
  • XCTestをimportしていれば利用できる(ライブラリのインストールなどは不要)
  • あるクラスの特定のメソッドをモック化し、戻り値などを任意に変更できる
  • テスト用の関数内でスタブ化したいクラスのサブクラスを作成し、メソッドをオーバライドすることによって、モッククラスのスコープをその関数内で利用できる

Manual Mockingを利用したUT

AppSettingTest.swift
    /// Bridging-Header.hを作成しているのでXCTest以外のimportは無し
    /// Swiftクラスをテストする場合もXCTestのimportは必要
    import XCTest 

    @testable import App /// Swiftクラスのテストコードを作成するときに記述する. Obj-Cのみの場合は必要ない

    class AppSettingTest: XCTestCase {

        /// Appをテストクラス内で使い回すためにプロパティとして準備する(テストメソッドごとに作成してもOK)
        var app: App? = nil

        override func setUp() {

            super.setUp()

            /// Manual Mocking:Mock用インスタンスの中身を変更する
            class AppMock: App {
                override func isApp() -> Bool { ///AppクラスのisApp()メソッドをモック化して戻り値を指定
                    return true
                }
            }

            /// Mock化したメソッドを含んだクラスを空のインスタンスに入れる
            self.app = AppMock()
        }

        func testAppVersion() { /// このメソッドはAssertの例を示すために架空のメソッドを追加している
            /// AssertはXCTestの書き方
            XCTAssertTrue(app?.isApp())
            XCTAssertFalse(app?.isApp())
        }
    }
5
2
0

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
5
2