dotrikunの日記

日々マンガを読んだりプログラムを書いたりしています。

SwiftのテストクラスでObjective-Cのプライベートメソッドをテストする

この記事は Sansan Advent Calendar 2015の20日目です。

こんにちは。

2015年が終わろうとしている現在もObjective-Cで消耗している者です。

ちなみに2016年も絶賛消耗する見込みです。

地獄の業火に焼かれながら、それでもSwiftに憧れる

本当はSwiftiOSアプリ開発したい!

でもプロダクトコードに入れるにはちょっと(///

という訳でまずはユニットテストだけSwiftで書くことになりました。

ユニットテストだけSwiftで書く場合

普通にSwiftでテストクラスを追加し、

テストしたいObjective-CのクラスをBridging-HeaderでimportすればOKです。

以下はHogeObjcClassというObjective-CのクラスのisValidメソッドをテストしたい場合の例です。

/*
     Bridging-Header
*/

#import "HogeObjcClass.h"
/*
     Swiftで書いたテストクラス
*/

import XCTest

class HogeObjcClassTests:XCTestCase {
    
    func testObjcMethod(){
        XCTAssertTrue(HogeObjcClass.isValid())
    }
}

プライベードメソッドをテストしたい場合

で、ちょっとめんどくさいのがテストしたいメソッドObjective-Cのクラスでプライベートな場合です。

そんな場合はHogeObjcClassのカテゴリを作成し、

/*
     プライベートメソッドテスト用のカテゴリ
*/
#import "HogeObjcClass.h"

@interface HogeObjcClass (PrivateTest)

+ (BOOL)privateMethod;

@end

さらにBridging-Headerで作ったカテゴリをimportします。

/*
     Bridging-Header
*/

#import "HogeObjcClass.h"
#import "HogeObjcClass+PrivateTest.h"

こうしてあげるとSwiftのテストクラスでObjective-Cのプライベートメソッドが使えるようになります。

/*
     Swiftで書いたテストクラス
*/

import XCTest

class HogeObjcClassTests:XCTestCase {
    
    func testObjcMethod(){
        // プライベートメソッドが使える
        XCTAssertTrue(HogeObjcClass.privateMethod())
    }
}

新しくプロジェクト作る場合はおとなしくSwiftで書きましょうということで、、、