CarthageでQuickを導入してテストを動かしてみるまで

# 導入

この導入項目に関しては基本的には[公式](https://github.com/Quick/Quick/blob/master/Documentation/en-us/InstallingQuick.md#carthage)に沿ったものを日本語で書いて、適宜補足を入れるかんじの記事になります。
では順を追って説明します。

## プロジェクト作成
プロジェクト作りましょう。

## Cartfile.privateファイルを作成する
コマンドラインツールでルートディレクトリに移動して`touch Cartfile.private`コマンドを叩きます。
touchコマンドは基本的にはファイルのタイムスタンプを変更するコマンドですが、ファイルが存在しなかった場合は空のファイルが作成されます。

Cartfile.privateについてですが、「.private」ってなんだ？と思って調べたところ、Carthageのコミッターの方のスライドを見つけました。
http://www.slideshare.net/syoikeda/carthagen
スライドの12ページ目によると、「テストターゲット用の依存性などFramework自体のビルドに必要ないものはこちらに」ということでした。
Quickの場合はテストの時のみ使用するので、Cartfile.privateに書くのが適切ですね。

## Cartfile.privateファイルに記述する
エディタを開き、Cartfile.privateを編集します。
内容としては以下の通りになります。

```
github "Quick/Quick"
github "Quick/Nimble"
```

## ライブラリをビルドする
以下のコマンドを打ちます。

```
carthage update --platform iOS
```

ビルド物はiOS用しか使わないので、`--platform iOS`も指定しています。
これでビルドできたはずです。

## Link Binary With Librariesに追加する

Carthage/Build/iOSの下にNimble.frameworkとQuick.frameworkがあるはずです。
それをテストターゲットの<プロジェクト名>.xcodeproj -> Build Phases -> Link Binary With Librariesにドラッグ＆ドロップします。

![スクリーンショット 2016-01-17 18.06.26.png](https://qiita-image-store.s3.amazonaws.com/0/100736/5e9adc3c-9c2d-dcec-63e4-ced4140202b0.png)

## Copy Files Phaseの項目を追加する

同じくテストターゲットで、Build Phaseを追加します。
左上の方の「＋」ボタンをクリックして、New Copy Files Phaseを選択します。

![スクリーンショット 2016-01-17 18.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/100736/124ea7c4-a2ac-4d2f-6d55-a8c9b9fbb8d8.png)

## Copy Filesに2つのフレームワークを追加する

まずDestinationをFrameworksに変更します。
次にフレームワークを追加したいので、左下の「＋」ボタンをクリックします。

![スクリーンショット 2016-01-17 18.17.46.png](https://qiita-image-store.s3.amazonaws.com/0/100736/b809f51a-8696-d8d4-7ec8-2db242d56f3d.png)

Nimble.frameworkとQuick.frameworkを選択してAddします。

![スクリーンショット 2016-01-17 18.18.59.png](https://qiita-image-store.s3.amazonaws.com/0/100736/31528fc1-1a4c-4e51-34ff-96b954312a60.png)

試しにビルドしてみてエラーが出なかったら成功です。

# テスト準備

## コードを書く

```swift:Animal.swift
class Animal {
    
    private let name: String
    
    init(name: String)
    {
        self.name = name
    }
    
    func selfIntroduction() -> String
    {
        return "My name is \(self.name)"
    }
    
}
```

## テストコードを書く

```swift:QuickSampleSpec.swift
import UIKit
import Quick
import Nimble

class QuickSampleSpec: QuickSpec {
    override func spec() {
        describe("a animal") {
            var animal: Animal?
            beforeEach {
                animal = Animal(name: "Pochi")
            }
            
            it("self-introduction") {
                expect(animal?.selfIntroduction()).to(equal("My name is Pochi"))
            }
        }
    }
}
```

「describeって何？」的な話は別の記事で書こうと思います。
とりあえず「AnimalクラスのselfIntroductionの戻り値は"My name is Pochi"であるはず」というテストを書きました。

# 実行

command + U で実行します。Test Succeededと表示されれば成功です。
失敗した場合はこのように期待値と実際の値を表示してくれます。
![スクリーンショット 2016-01-17 21.28.11.png](https://qiita-image-store.s3.amazonaws.com/0/100736/0632d81c-9472-dc17-1f3a-3d369f5347c5.png)

ちなみにテスト実行が2回目以降であればどちらかのチェックマークをクリックしてもテストが実行されます。
(command + Uで実行するとUITestがある場合はそちらも実行されてしまうのでその分時間がかかります)
![スクリーンショット 2016-01-17 21.57.02.png](https://qiita-image-store.s3.amazonaws.com/0/100736/acb87120-5294-1576-6cc8-baec5ca69aef.png)

![スクリーンショット 2016-01-17 21.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/100736/48dc5b93-3c87-50a5-f16e-966cdaf4f683.png)



# 余談

たまに引っかかっちゃうんだよな、、、という話。

最初テストクラスを書いていた時にこんな現象が起こりました。
![スクリーンショット 2016-01-17 22.11.51.png](https://qiita-image-store.s3.amazonaws.com/0/100736/88fa2495-3bb7-4f8f-769d-f38f86258c17.png)
Use of undeclared typeエラーが出ているけど、ビルドは成功するし、ちゃんとAnimal.swiftも存在する。

結論から言えばAnimal.swiftがテストターゲットのCompile Sourcesに入っていませんでした。
ということで左ペインでAnimal.swiftをクリックし、右ペインのTarget Membershipの<プロジェクト名>Testsにチェックを入れます。
![スクリーンショット 2016-01-17 22.18.10.png](https://qiita-image-store.s3.amazonaws.com/0/100736/6cff94c6-3f0b-4d50-6817-fee50d7c8408.png)
これで無事にエラーがなくなりました。