: O. Yuanying

Sinatra のヘルパーをスタブする

最近さっぱり Sinatra の話題を聞かなくなったので需要があるのかどうかわからぬが、 Sinatra アプリのテストを書いてるときにヘルパーメソッドのスタブ化にちょい一苦労したのでその話題。

とりあえずスタブしてみた

簡単な Hello World を出力する Sinatra アプリのヘルパーをスタブしてテストしてみた。

以下のような出力でテスト失敗する。

$ rspec sinatra_helper.rb 
.F

Failures:

  1) Sinatra::Application hello をスタブしてるとき、 Hello Stub! を返す。
     Failure/Error: expect(last_response.body).to eq('Hello Stub!')

       expected: "Hello Stub!"
            got: "Hello World!"

       (compared using ==)
     # ./sinatra_helper.rb:30:in `block (3 levels) in <top (required)>'

Finished in 0.02583 seconds
2 examples, 1 failure

Failed examples:

rspec ./sinatra_helper.rb:28 # Sinatra::Application hello をスタブしてるとき、 Hello Stub! を返す。

スタブされてなーい!

Sinatra のソースを読んでみた

読んでみたところ、 アプリケーションが call される直前で dup されてやがる…。

allow_any_instance_of は逃げだと思ったのでいろいろこねくり回したところ、以下のようになった。

要するに dup される前に dup をスタブして、 事前に dup しておいたアプリケーションインスタンスを返すようにしておき、 そのアプリケーションインスタンスをスタブするという…。

なんかとてもバッドノウハウな気がしてきた。

とりあえず rails でテスト書いた後に Sinatra や Padrino でテスト書く羽目になると、どれだけ rails が恵まれていたか再認識できますな!