Swiftの導入としてObjective-Cのクラスの単体テストを書く


ある程度の規模になっているObjective-CベースのiOSアプリで、「よっしゃSwift導入や！」ってなっても、
「開発者が馴染んでいない言語を実戦投入したら、コーディングガイドラインもないし、コード品質が下がってしまう」みたいな懸念があると、きっと思います。
でも、やっぱりSwiftは触ってみたいし、少しずつ触っておきたい、みたいなケースはないでしょうか？

なら、簡単な導入として、単体テストだけSwiftで書いてみればいいんじゃない？と思ってやってみたらすごく簡単だったのでその紹介です。

### 前提
* Obj-Cで書いているアプリ
* 単体テストは既にある. (フレームワークはXCTest)

### Swiftのテストケースを追加
おもむろに "New File..." から Test Case Classesを選んで、新しいテストクラスを追加します。
LanguageはSwiftにします。

![スクリーンショット 2015-04-14 6.41.17 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/d3d0d16f-ef97-f126-9981-ebac28158742.png "スクリーンショット 2015-04-14 6.41.17 PM.png")


ファイルを追加すると、丁寧にBridging-Headerを追加しますか？って言われるので、Yesとして追加しておきます。

![スクリーンショット 2015-04-14 6.41.36 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/63fa7896-2e84-b564-81dd-142139251c37.png "スクリーンショット 2015-04-14 6.41.36 PM.png")

すると、こんな感じでテストが追加されます。

```
//
//  MyFirstSwiftTestCase.swift
//

import UIKit
import XCTest

class MyFirstSwiftTestCase: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}

```

これを実行すると、このテストも実行されます。
![スクリーンショット 2015-04-14 6.55.41 PM2.png](https://qiita-image-store.s3.amazonaws.com/0/15582/fcbe9b2a-fdfd-f6e2-e14d-f617db5cf33a.png)

便利ですね。

### Obj-Cのクラスをテストする
例えばObj-Cのファイルに以下のようなものがあったとして、それをテストします。

```NSString+Split.h
//
//  NSString+Split.h
//

#import <Foundation/Foundation.h>

@interface NSString (Split)
- (NSArray *)split:(NSString *)token;
@end

```

```NSString+Split.m
//
//  NSString+Split.m
//

#import "NSString+Split.h"

@implementation NSString (Split)
- (NSArray *)split:(NSString *)token
{
    return [self componentsSeparatedByString:token];
}
@end
```

##### Bridging-Header に追加
MyFirstSwiftTestCase.swiftを作るときに自動で作られたBridging-HeaderにこのObj-Cのヘッダを追加します。


```Tests-XCTest-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "NSString+Split.h"
```


##### テストコードの修正
MyFirstSwiftTestCase.swiftでNSString+Splitをテストします。
Swiftで書いたテストコードからObj-Cのメソッドを呼び出します。

```
func testSplit() {
    let split = "hoge/fuga/piyo".split("/") as [String]
    XCTAssertEqual(split.count, 3, "3つに分割されるはず")
    XCTAssertEqual(split[0], "hoge", "最初はhoge")
    XCTAssertEqual(split[1], "fuga", "二つ目はfuga")
    XCTAssertEqual(split[2], "piyo", "三つ目はpiyo")
}
```

実行すると無事テストできます。
![スクリーンショット 2015-04-14 7.10.11 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/afd76a8f-9027-f327-d928-6321ac2681fa.png "スクリーンショット 2015-04-14 7.10.11 PM.png")

もちろん、おかしいテストを実行するとこけます。
![スクリーンショット 2015-04-14 7.12.32 PM.png](https://qiita-image-store.s3.amazonaws.com/0/15582/3558d9ed-a5b6-9fb1-9f20-4d6fad380632.png "スクリーンショット 2015-04-14 7.12.32 PM.png")

ということで、まずはSwiftでテストコードを書くところから始めるのはいかがでしょうか？