ukoasis blog

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定義が必要