- 更新日: 2013年12月18日
- RSpec
RSpec の Shared Examples(shared_examples_for)機能
RSpec の Shared Examples という機能を勉強しました。この機能を用いると共通のテストコードを、文字通り Shared Examples(共有用の見本コード)で共有できて、テスト用コードをぐっと短く読みやすくできます。それぞれのテストは、let で独自の値を設定する。
以下、最初に Shared Examples 機能を使わないコードを書いて、その後 Shared Examples 機能を使ったコードに書き換えます。
Shared Examples を使わないコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
require 'spec_helper' describe "HomePages" do subject { page } describe "Home page" do before { visit root_path } it { should have_content(full_title('')) } it { should have_title(full_title('')) } it { should_not have_title('| Home') } end describe "Help page" do before { visit help_path } it { should have_content('Help') } it { should have_title(full_title('Help')) } end describe "Contact page" do before { visit contact_path } it { should have_content('Contact') } it { should have_title(full_title('Contact')) } end end |
この RSpec テストコードを Shared Examples を用いて書き換えます。
Shared Examples を使ったコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
require 'spec_helper' describe "Home pages" do subject { page } shared_examples_for "all static pages" do it { should have_content(heading) } it { should have_title(full_title(page_title)) } end describe "Home page" do before { visit root_path } let(:heading) { full_title('') } let(:page_title) { '' } it_should_behave_like "all static pages" it { should_not have_title('| Home') } end describe "Help page" do before { visit help_path } let(:heading) { 'Help' } let(:page_title) { 'Help' } it_should_behave_like "all static pages" end describe "Contact page" do before { visit contact_path } let(:heading) { 'Contact' } let(:page_title) { 'Contact' } it_should_behave_like "all static pages" end end |
shared_examples_for メソッドに、”all static pages” という引数を渡して、見本コードの名前を付けて、そのブロックの中で見本となるコードを書きます。見本コードの中の変数は、各々テスト呼び出しコード側で、let により設定をします。そして、it_should_behave_like “all static pages” で、Shared Examples を呼び出し。
shared_examples_for のブロック部分の Example 用のコードが長くなればなるほど、Shared Examples 機能の恩恵を受けられますね。RSpec + Capybara はすごいなあ、本当に自然英語のようにコードの読み書きができて驚きです。
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec+Capybaraで同名の複数要素の並び順をテストする
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
Leave Your Message!