TitaniumいちいちiPhoneシミュレータを起動して結果を確認するのはだるいのではないか、単体テストが有効なクラスならばTitanium外で作ってもいいんじゃない?と思いこないだはNode.jsを利用したテストに走ったわけだけど、TitaniumのAPIを利用したクラスのテストをしたくなりTitanium内に舞い戻った。スタブとかモックを使えばいいじゃないって?いやー、それもなかなかしんどいしね。それに特に問題なかったら本物使った方がいいと思いますよ。Titaniumを公開しました。個別のスペックのみ実行できるようにといった改良が図られているのでこの記事の内容よりオススメです。次のものはすべてResource以下での出来事。JasmineJasmineのコアを準備。以前作ったTitanium用のReporterも利用。lib/jasmine/jasmine.jslib/jasmine/jasmine-titanium.jsRunnertitanium-specs.jsjasmin-nodeのspecs.jsにあたるものを作りました。finished');specディレクトリからスペックファイル(ファイル名が_spec.jsで終わるもの)を探して、スペックファイルのファイル名と対応するクラスファイルをlib内から探し出してinclude。libとspecは決めうち。コード例app.jstitanium-specs.jsをincludeするのみ。Ti.include("titanium-specs.js")実際のアプリのコードとの混在については少し後で。スペックだけ走らせる。lib/map_helper.jsMapView関連のメソッドをまとめておく用に定義したクラス。モンスタークラスに育ちそうな名前だが、育ちすぎを感じたら随時リファクタリングしていくとしよう。テストがあるから「後でリファクタリング」が大人の嘘にならない。「後で」というか「必要に応じて随時」だけど。MapHelper;})();spec/map_helper_spec.jsスペック。実際はテストファーストしてますよ。});});実行これでシミュレータを起動。Finished.なかなか上出来ではないでしょうか。アプリとテストの共存アプリとテスト。通常のapp.jsの内容にテストを走らせるコードを混ぜたくない。そこでアプリ起動用とテストを走らせる用のシェルスクリプトを別々に作成して、コマンドラインから叩くことで起動するようにしてみた。app.jsからはTi.include("titanium-specs.js")は削除して、通常のTitaniumアプリケーションのapp.jsと同様の内容にしておく。run.shこちらは普通にアプリを起動する。~/works/myproject/specs.shテストを実行するスクリプト。app.js.backupapp.jsをいったん退避させてtitanium-specs.jsをapp.jsにして起動することでテストを実行。実行後もとのapp.jsに戻すという力技。明らかにもっとスマートな方法がありそうだけどうまく動くからよしとしましょう。残っている問題しかし結局アプリの動作環境とテストの動作環境が分離してないので、テスト走らせたらプロパティとかDBとかの内容がガタガタになります。あとGUIから実行する場合はアプリとテストが分けられない。Titaniumを知らないことが多いのでもしかするともっとうまい方法があるのかもしれない。Mobileを二ヶ月くらいさわってみた感想。今年に入ってからほぼ毎日触ってました。ほとんどiPhone開発しかしてない感想。主観的なところをだらだらと書いてみましょう。気に入っているところイマイチと思うところを挙げてみたい。素のJavaScriptではオブジェクトが同じ内容かどうかを調べるのはけっこうめんどうだが、MooToolsを利用してObject.toQueryStringで文字列に変換して比較すると楽。MooToolsSQLの文法エラーでTitaniumさんが無言でオチる件もっとコミュニケーションしようぜ。気に入らないところがあれば俺だって直すしさ。いうことでつまらんタイポで相当時間を浪費してしまった。ちなみにJavaScriptの例外処理も突き抜けて落ちます。MapHelperは独自に定義したクラス。[...]検索:書いてる人サーバーサイドのインフラ構築とプログラミングをたしなむハーフスタックくらいのフリーランスプログラマー。カメラはペンタックス。