BDDでCocoa開発をするのにRSpecを使ってみるの続き。

なんだか意外と簡単に使えそうだったのでこんどはCocoa組込みじゃないフレームワークで試してみよう、ということでOgreKit。こちらは事前にコンパイルして/Library/Frameworks以下に配置済。と、ここでそもそもどうやってフレームワークを呼び出すのかわからなくて一思案。本家サイトでなんか書いてないかなーと探してみるも、どこに書いてあるんだかわからん。ActiveRecordSupportとか興味深いことが書いてあるのも見つけたけどとりあえず後回し。

サンプルのソースを見てたらOSX.require_frameworkを使うらしいというのはわかったんだけど、読み込んだフレームワークのクラスがどこにあるのかわからずしばらく悩んだ。OgreKit::OGRegularExpressionとかやってみてそんなもん無いと怒られたり。冷静に考えれば、Objective-CだったらRubyみたいにモジュールがネストしてないのでOSX::OGRegularExpressionがでよかったんだけど、それを見つけるまでGoogle先生を質問攻めにしてしまった。さてそんなわけでできたのがこんな感じ。

require 'osx/cocoa'
include OSX
require_framework 'OgreKit'

describe OGRegularExpression do
  before :each do
    @match_string   = 'Ich liebe dich, aber du liebst ihn. Ich liebe dich...'
    @unmatch_string = 'Ich mag nicht nur Ruby, sondern Objective-C.'
    @expression     = 'dich'
    @ogregex        = OGRegularExpression.regularExpressionWithString(@expression)
  end
  
  before :all do
    @result         = []
  end
  
  after :all do
    p @result
  end 
  
  it "should replace matches" do
    # Rubyのメソッド呼び出しっぽいスタイル
    replaced = @ogregex.replaceAllMatchesInString_withString(@match_string, 'mich')
    replaced.to_s.should_not include(@expression)
    @result << replaced.to_s 
  end
  
  it 'should replace nothing when no matches in string' do
    # こっちはObjective-Cのメッセージパッシングっぽいスタイル
    not_replaced = @ogregex.objc_send(:replaceAllMatchesInString, @unmatch_string, :withString, 'mich')
    not_replaced.to_s.should eql(@unmatch_string)
    @result << not_replaced.to_s
  end
end
$ spec ogrekit_spec.rb
..["Ich liebe mich, aber du liebst ihn. Ich liebe mich...", "Ich mag nicht nur Ruby, sondern Objective-C."]


Finished in 0.018822 seconds

2 examples, 0 failures

でけたでけた。変換の例に使ってる文章が何なのかは気にしない方向で。OgreKitのSpecなのに正規表現使ってないのも気にしたら負けかなと思ってる。で、OgreKitは既に有効なロードパスの中にあったのでフレームワーク名で呼び出せたけど、OSX#require_frameworkは引数にフレームワークのフルパスも与えられるので、フレームワーク化してしまえば自分で作った任意のObjective-Cクラスも簡単に扱える。まだ試してないけどバンドルをロードする機能もある。思ったんだけど、gemのパッケージを自動生成するやつみたいにwigetのファイル構成とかビルドするRakefileとかのジェネレータを作ったら便利かもしれない。wdigetならインターフェースもバンドルの開発もCUI上で完結できるし、RSpecで確認しながら作るスタイルは向いてるかも。Dashcodeが出ようってご時世に何を言ってるんだか…でもvimのが楽なんだもん、Xcodeでいろいろやるより。

あと、初めてRubyCocoaを見たときにも思ったんだけど、Objective-Cはメソッド名が長いなぁやっぱり。CamelCaseもRubyの中にあるとどうしても違和感が拭えない。慣れるっきゃないかな。Objective-Cで書いてるとそんなに気にならないんだけど。何でだろ。

さて、なんだかRubyCocoaを触ってみよう、なノリになってきたけど、目的はRSpecでもRubyCocoaでもなくて「CocoaでBDD」。これをどうにかしてCocoaアプリの開発に取り入れてみたいと思う。いちいちアプリをフレームワーク化してビルドしてterminalからspec実行して、とかやりはじめたら本末転倒。Xcodeで上手く自動実行させる方法を考えよう、と。