読者です 読者をやめる 読者になる 読者になる

Swiftでテストケースを書く際の疑問

最近のiOS開発ではユニットテストという概念がIDEに組み込まれていました。Xcode6.01でプロジェクトを新規作成するとターゲットモジュール名+「Tests」という命名規則でテスト用のモジュールが作られます。見るからにJUnitな作りで狙いがわかりやすい。setUp、testXXX、tearDown。テスト用のアサーションツールが用意されていますけど、この上にのせるbehavior指向なフレームワークもすでにあるっぽい。

でも、ちょっと書いてみたら速攻で詰まった。名前空間がモジュール別なので、ターゲットモジュールとテストモジュールが別ということはテストケースからテスト対象が見えない。。。

import XCTest
import SampleTarget
class PersonTest: XCTestCase {
    override func setUp() {
        super.setUp()
        // テストケーススコープでの準備
    }

    func testPeople() {
        let p = People()
        //テストする
    }

    override func tearDown() {
        // 後始末
        super.tearDown()
    }

}

まずやることはテストのほうでターゲットモジュールをimportして、

public class Person {
    public init() {
    }
}

テスト対象の方はこんな感じにいちいちpublicにする。特にイニシャライザをpublicにしないといけないため、イニシャライザが無くても書かないといけない。importのほうはまだ良いとしても、そのうちターゲットを全部publicにしないといけないのというのは不要になってくれないかと思う。可視性広げても支障は特別ないんだけど、なんか長年の習慣として可視性についてはなるべく隠蔽するように書くので、気持ちわるくって。