SwiftでQuickのテスト対象をTyphoonから呼び出す
February 07, 2015
最近、色々試してみて、ちょっと動いたのでまとめを兼ねてメモ。とりあえずタイトルの通り、Quickからテストするための対象をコンテナから取得するところまで。最終的には、テスト時に依存しているライブラリをmockに差し替えることをしたい。
参考
https://github.com/appsquickly/Typhoon-Swift-Example http://qiita.com/fmtonakai/items/711e41eebcc040936668 http://qiita.com/ikesyo/items/558e207e919f408ec0f9
概要
テストターゲットにTyphoonFrameworkが利用できるように設定する
こちらの設定については、以前やったので、それを参考に実施。
beforeEachでテスト対象を取得する
factory(コンテナ)を取得して、そこからテストの対象を得る。自分は以下の様なコードになった。
import Quick
import Nimble
import Typhoon
import TestApp
class HogeServiceTests: QuickSpec {
override func spec() {
describe("HogeService") {
var hogeService: HogeService?
beforeEach {
let factory = TyphoonBlockComponentFactory(assemblies: [ServiceAssembly()])
hogeService = factory.componentForKey("hogeService") as HogeService?
}
}
}
}
ServiceAssembly
内で、HogeService
に関する設定をしていて、それを利用するイメージ。自分がハマったのはメインのターゲットの中で指定しているAssembly
が見えなかったこと。これはQuick
とかTyphoon
とか関係なく、アクセス制御についての理解が足りなかったことが原因。
アクセス修飾子を指定しないとデフォルトでinternalになります。 http://qiita.com/fmtonakai/items/711e41eebcc040936668
サンプルアプリを参考に、アプリターゲットをimportに指定することが必要と気づいたが、Assembly
が見えない・・・public
をつけたら解決・・・
最後に
今回、学んだのは下記2点。あまり、TyphoonFrameworkに関係ない気がするが、これで、コンテナから取得できるようになったので、後はmockとの入れ替えにチャレンジしていく。
- アプリターゲット内のクラスをテストで参照・利用するためには、アプリターゲット名をモジュールとして、インポートすることが必要
- アプリターゲット内で定義している
assembly
を利用するためには、public
定義が必要