iOS向けライブラリ/アプリから学ぶ単体テスト

iOS向けライブラリ/アプリの単体テスト手法について調査した内容のメモ。（Objective-C前提です、、）


# Mantle 1.5

## URL
* https://github.com/Mantle/Mantle/tree/1.5

## 構成
* すべてSpectaを利用した記述
  * Specta開発元なのでSpecta利用の参考になる
* 環境定義用クラスはなし
  * pchファイルで補助ツールのインポート

## テスト実行
* TravisCI利用
  * CI用のスクリプトを定義

## 補助ツール
* Expecta
* Specta


# Octokit 0.5

## URL
* https://github.com/octokit/octokit.objc/releases/tag/0.5

## 構成
* すべてSpectaを利用した記述
  * Specta開発元なのでSpecta利用の参考になる
* `OCTClientSpec`で通信スタブの`OHHTTPStubs`を利用
  * 通信の設定を簡略化させるblocks定義あり
* 環境定義用クラスはなし
  * pchファイルで補助ツールのインポート

## 補助ツール
* Expecta
* Specta
* OHHTTPStubs


# AFNetworking 1.3.4

## URL
* https://github.com/AFNetworking/AFNetworking/tree/1.3.4

## 構成
* 環境定義用クラス `AFNetworkingTests.h/.m`
  * 補助ツールのインポート
  * loadメソッドのオーバーライド
  * ログ出力の設定
* プロトコル用のモック定義
 
## テスト実行
* TravisCI利用
  * rakeでコマンド定義

## 補助ツール
* Expecta
* OCMock


# RestKit 0.23.3

## URL
* https://github.com/RestKit/RestKit/tree/v0.23.3

## 構成
* RestKit自体にテスト用クラス群あり `<RestKit/Testing.h>`
* 環境定義用クラス `RKTestEnvironment.h/.m`
  * TestCaseクラスのサブクラス `RKTestCase` を定義
  * 各テストは `RKTestCase` クラスのサブクラスで定義
  * initializeメソッドをオーバーライド
  * 補助ツールのインポート
  * フィクスチャのバンドル定義
  * ディレクトリの存在チェック
  * モデルからテストファクトリ作成
* フィクスチャ
  * 画像
  * JSON
  * XML
* 簡易的なモデルオブジェクトクラス定義
  * テストファクトリの作成に利用
* Spectaの利用は局所的
  * `RKResponseDescriptorTest` のみ
* テストごとにライブラリの利用などが異なる
 
## テスト実行
* rakeでテストサーバーの制御とテスト実行を管理
  * sinatoraをテストサーバーとして利用

## 補助ツール
* OCHamcrest 3.0.1
* Expecta 0.3.1
* OCMock 2.2.1
* Specta 0.2.1


# iOctocat 1.8.1.7

## URL
* https://github.com/dennisreimann/ioctocat/tree/v1.8.1.7

## 構成
* 環境定義用クラスはなし
  * pchファイルで補助ツールをインポート
  * pchファイルでアプリで利用する定数定義ファイルをインポート
* ヘルパークラス `IOCTestHelper.h/.m` を定義
  * フィクスチャ利用のためのヘルパーメソッド
* フィクスチャ
  * JSON
  
## テスト実行
* テスト実行のためのスクリプトあり (ruby)
  * guardを利用してファイル変更時のテスト自動化が可能
* TravisCI利用

## 補助ツール
* Expecta

 
# Overline 0.4.0

## URL
* https://github.com/yaakaito/Overline/tree/0.4.0

## 構成
* カテゴリ拡張のメソッドに対するテスト
 
## 補助ツール
* OCHamcrest


# BrowseOverflow

## 構成
* Model, View Controller, Data Source, Delegateのテストあり
* モックやスタブは自前で実装

## 補助ツール
* なし


# 参考

## 気付いたこと
* テストに慣れ親しみたいのなら、カテゴリを拡張したライブラリ（`Overline`など）から眺めてみるのが良さげ
* Spectaを使いたいなら、`Mantle`と`Octokit`を眺めてみるのが良さげ
* 非同期テストも簡単にやりたいならExpectaか

## AFNetworking 1.3.4 のテスト内容の一部
* `AFHTTPRequestOperationTests.m`
    * (区分けなし)
        * 成功時に成功用の完了ブロックが実行されレスポンスオブジェクトを受け取れること
        * 失敗時に失敗用の完了ブロックが実行されエラーを受け取れること
        *  リクエストをキャンセルするとキャンセルのエラーがセットされること
        * リクエストをキャンセルすると失敗用の完了ブロックが実行されること
        * 500ステータスコードによる失敗時に失敗用の完了ブロックが実行されエラーを受け取れること
        * 302ステータスコードの遭遇によりリダイレクト用のブロックが実行されること
        * 複数回の302ステータスコードの遭遇によりリダイレクト用のブロックが複数回実行されること
    * 停止
        * 停止ができること
        * 停止後に再開ができること
        * 停止から再開後に完了ブロックが実行されること
    * レスポンス文字列のエンコード
        * 文字パラメータが提供されない際に文字列エンコードがISOLatin1であること
        * SiftJISの文字パラメータが提供された際に文字列エンコードがShiftJISであること
        * 不正な文字パラメータが提供された際に文字列エンコードがUTF-8であること
        * UTF-8の文字パラメータが提供された際に文字列エンコードがUTF-8であること
* `AFHTTPClientTests.m`
    * `setUpメソッド`
        * AFHTTPClientのインスタンスをプロパティへセット
        * イニシャライザのテスト以外はプロパティ経由でインスタンスを取得
    * (区分けなし)
        * イニシャライザメソッドが例外を発生させること
        * イニシャライザメソッドで指定されたパスの末端にスラッシュが追加されること
        * デフォルトの文字列エンコードが意図通りであること
        * デフォルトのパラメータエンコードが意図通りであること
        * デフォルトのヘッダー群が意図通りであること
        * Reachabilityステータスが正しいこと
        * JSONRequestOperationの設定が正しいこと
        * XMLRequestOperationの設定が正しいこと
        * ImageRequestOperationの設定が正しいこと
        * すべてのリクエストが完了した際にエンキューされたバッチの完了ブロックが呼ばれること
        * 不正なユーザー名とパスワードによる認証ヘッダーが意図通りであること
        * 正しいユーザー名とパスワードによる認証ヘッダーが意図通りであること
        * 認証ヘッダーがリセットされること
        * デフォルトのクレデンシャルを利用すること
        * 簡潔な辞書を与えたAFQueryStringFromParametersWithEncodingが意図通りであること
        * 複雑な入れ子のパラメータを与えたAFQueryStringFromParametersWithEncodingが意図通りであること
        * AFQueryStringFromParametersWithEncodingがパーセントエスケープを適用すること
        * cancelAllHTTPOperationsWithMethod:path:メソッドがマッチしたオペレーションのみをキャンセルすること
        * デフォルトの文字列エンコードがUTF-8であること
        * FormURLParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
        * JSONParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
        * PropertyListParameterEncodingを指定してパラメータを与えたPOSTリクエストの生成が意図通りであること
        * パラメータを与えたPOST通信が意図通りであること
        * enqueueBatchOfHTTPRequestOperations:メソッドが登録したHTTPRequestOperationクラスを適切に利用してオペレーションを構成すること（ **OCMock利用** ）
        * enqueueBatchOfHTTPRequestOperations:メソッドが正しい順序でオペレーションをエンキューすること（ **OCMock利用** ）