- 更新日: 2015年6月16日
- RSpec
RSpec+Capybaraで同名の複数要素の並び順をテストする
同名のCSSセレクタの要素が複数並んでいる HTML の場合で、それらの要素の並び順を RSpec + Capybara でテストする Request Spec の例です。Capybara の page.all と find の機能を使って解決しました。
— 環境 —
capybara 2.4.4
rspec-rails 3.1.0
典型的な例としては、以下のように div タグの class が同名で、複数の要素が繰り返し出力されている場合。
1 2 3 4 5 6 7 8 9 10 11 12 |
<div class="greeting"> <h2>good morning</h2> </div> <div class="greeting"> <h2>good afternoon</h2> </div> <div class="greeting"> <h2>good evening</h2> </div> <div class="greeting"> <h2>good night</h2> </div> |
page.all(“.greeting”) で greeting のCSSセレクタが指定された class の複数要素を全て取得した後、要素1つずつに find を使って、h2要素の中身のテキストが正しい順で並んでいるかどうかを Request Spec のテストで確認しました。
1 2 3 4 5 6 7 |
describe "greetings is sorted by correct order" do let(:greetings) { page.all(".greeting") } specify { expect( greetings[0].find('h2').text ).to eq "good morning" } specify { expect( greetings[1].find('h2').text ).to eq "good afternoon" } specify { expect( greetings[2].find('h2').text ).to eq "good evening" } specify { expect( greetings[3].find('h2').text ).to eq "good night" } end |
これで上手いこと動いてくれて、テストで確認できました。要素がさらに多い場合は、確認するテキストなどを正しい順序の配列にして each で回せば良いかな。
以下の記事などを参考。1つ目の英文記事だと、配列から Capybara nodes の find を使うな、と記事のタイトルに書いてあるのですけどね…
Do not use “find” on Capybara nodes from an array – makandropedia
Module: Capybara::Node::Finders — Documentation for jnicklas/capybara (master)
Capybara で同名の CSS セレクタを持つ複数の HTML 要素から任意の要素を見つける | EasyRamble
以上です。
- RSpec の関連記事
- FactoryGirlをSpringと共に使う時の注意
- 複数モデルのpost :createをテストするRSpecコード(Controller Spec)
- RSpec3でTime.nowをスタブ化(stub)
- RSpecでJSONによるPOSTリクエストをテスト
- RSpec & Capybara の雑感
- RSpec3ではrails_helper.rbがrequireされる
- Capybara + Launchy で RSpec テストをブラウザで確認
- CapybaraのwithinをRSpecで使う
- Serverspec(RSpec)のテスト出力に色を付けて見やすくフォーマット
- Serverspec で複数のホストで共通のテストを使い回す
Leave Your Message!