UTの作成準備
Objective-CクラスをSwiftでテストコードを作成する場合
-
AppTestsファイルに新規で「Unit Test Case Class」ファイルを追加する。
- サブクラス:XCTestCaseになっていることを確認
- Language:Swiftにする
TargetはAppTestsのみにチェックを入れる (ここで余計なファイルにチェックすると「Cannot load underlying module for ‘XCTest’」のコンパイルエラーが起こる。。。)
-
Objective-C Bridging Headerを作成する。以下のダイアログが出たら「YES」を選ぶと自動で作ってくれる。
(AppTestsのBuildSettingのSwift Compiler - GeneralのObjective-C Generated Interface Header Name にも自動的に登録される) -
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
-
作成したUTクラスに「import XCTest」があることを確認する。
SwiftクラスをSwiftでテストコードを作成する場合
- プロジェクトファイル .xcodeproj の "Defines Module" を YES に設定。→ Xcodeで対象のプロジェクトを開き、Build SettingsのDefines Modulesを "YES"にする
- 各テストクラスで @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())
}
}