開発メモ

開発関係のメモをいろいろと。たぶん。

アプリ側のファイルをテスト側で参照する2つの方法

Swiftで開発してる時、普通にテストを書くとエラーになる。

f:id:see_ku:20141012073825p:plain

では、どう対応するべきか?

動作を確認した環境

環境 情報
Xcode 6.0.1 (6A317)
Swift 1.0
Date 2014/10/12

テストに使うソースコードを、両方のターゲットに含める方法

File Inspectorから設定を変更して、アプリ側だけでなくテスト側にも含まれるように変更する方法。

f:id:see_ku:20141012073855p:plain

長所

  • アクセス制御がinternalのものもテストできる

短所

  • ファイルごとにいちいち設定する必要がある

テスト側で参照しているファイルがさらに別のファイルを参照している場合、すべてのファイルがテスト側に含まれるようにする必要がある。設定が不十分な場合、『Use of undeclared type』という、かなりわかりにくいエラーに。

プロジェクト全体を、テスト側で取り込む方法

Xcodeで普通にプロジェクトを作成するとプロジェクト全体が1つのモジュールになるので、このモジュールをテスト側で取り込むように設定する。

具体的にはこんな感じ。

import UIKit
import XCTest

// プロジェクト全体をimport
import JunkApp

class JunkReferenceTests: XCTestCase {
    func testExample() {
        let temp = JunkReference()
        XCTAssert(temp.number == 0, "Pass")
    }
}

この場合、『import JunkApp』の部分で、プロジェクト全体をモジュールとみなして取り込んでいる。

長所

  • いちいち、ファイルの設定を変更しなくて済む

短所

  • アクセス制御がpublicのものしかテストできない

注意点

フレームワークのテンプレートからプロジェクトを作成すると、なぜか、ターゲットの依存関係が設定されてないので、自力で設定する必要がある。

アプリのテンプレートからプロジェクトを作成した場合。

f:id:see_ku:20141012073920p:plain

フレームワークのテンプレートからプロジェクトを作成した場合。

f:id:see_ku:20141012073938p:plain

どちらを使うべきか?

  • 単独のアプリを作成している場合

テストで使うソースコードを両方のターゲットに含める方法が無難? いちいち、アクセス制御を真面目に設定しなくて済むのもメリットか。

基本は全体を取り込む方法で。内部の処理までテストしたい場合は、両方のターゲットに含める方法も併用すれば良いかと。