くりにっき

フルスタックキュアエンジニアです

RSpec 2.13.0を使ってみた

Ruby 2.0.0 p0の話かと思った?残念RSpec 2.13.0ちゃんでした!

Changelogを見てたらテンション上がってきたので使ってみました。

subject!

let!のsubject版

通常のsubjectが遅延評価でshouldが呼ばれた時に評価されるのに対し、subject!はbefore(:each)でhookして実行される模様。

戻り値以外で評価するメソッドのテストでitやbefore(:each)に書いていたものは subject! に移動させるとよさげ

--profile

テストの実行時間を計測してくれるのでトップ10を出してくれるスローテストの調査に重宝しそう。
プロファイル結果をJenkinsで集計するプラグインが望まれる。

$ be rspec --profile
............................................................

Top 10 slowest examples (10.58 seconds, 96.4% of total time):
  AndroidMarket use stub content behaves like android_market_base_examples #get_top_selling_paid_apps_in_category 
    1.54 seconds ./spec/android_market_spec.rb:83
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_grossing_apps 
    1.38 seconds ./spec/android_market_spec.rb:101
  AndroidMarket use stub content behaves like android_market_base_examples #get_top_selling_free_apps_in_category 
    1.32 seconds ./spec/android_market_spec.rb:77
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_new_free_apps 
    1.25 seconds ./spec/android_market_spec.rb:113
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_free_apps 
    1.24 seconds ./spec/android_market_spec.rb:89
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_new_paid_apps 
    1.24 seconds ./spec/android_market_spec.rb:107
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_paid_apps 
    1.24 seconds ./spec/android_market_spec.rb:95
  AndroidMarket use stub content behaves like android_market_base_examples #get_developer_app_list 
    0.69853 seconds ./spec/android_market_spec.rb:119
  AndroidMarket use stub content behaves like android_market_base_examples #get_developer_app_list 
    0.57257 seconds ./spec/android_market_spec.rb:71
  AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_new_paid_app 
    0.08922 seconds ./spec/android_market_spec.rb:59

その他

なんか微妙に挙動が変わってる気がする。

before(:all) do
  @app = very_heavy_method(arg)
end

let(:arg) { "name" }

subject{ @app }

its(:field){ should == "value" }

こういう感じのテストを書いてたのですが、2.13.0で落ちるようになりました。

で、いろいろやってたらletを参照してたものを直接 before(:all) 内にベタ書きするようにしたらテストが通るようになりました。謎い。。。*1

https://github.com/drecom/android_market_api/commit/2817f6defefa34ec8c6039c40fd064a654df7571

The RSpec Book (Professional Ruby Series)

The RSpec Book (Professional Ruby Series)

*1:before(:all)内ではちゃんとletの中身は取れていた