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 が恵まれていたか再認識できますな!