テストスイートとしてRSpec/Capybaraを使用しています。 <li>
の末尾に<ul>
を動的に追加するjavascriptがあります。これが確実に行われるように、リクエストスペックを記述したいと思います。
has_css
Capybaraメソッドと高度なCSSセレクターを使用して<li>
要素の順序をテストしてみましたが、Capybaraは+
CSSセレクターをサポートしていません。
例:
page.should have_css('li:contains("ITEM #1")')
pseuo_add_new_li
page.should have_css('li:contains("ITEM #1")+li:contains("ITEM #2")')
注文をテストする別の方法を知っている人はいますか?
この問題は、ページの本文コンテンツに対する正規表現の一致をテストすることで解決しました。少し賢いですが、それは動作します。
page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
CSSでこの動作をテストするより標準的な方法を見つけました。 _:first-child
_、_:last-child
_および:nth-child(n)
セレクターは、好きな方を使用して使用できます。
あなたの例では、これらのアサーションを試してみます:
_page.should have_tag("ul:last-child", :text => "ITEM #1")
pseuo_add_new_li
page.should have_tag("ul:nth-last-child(2)", :text => "ITEM #1")
page.should have_tag("ul:last-child", :text => "ITEM #2")
_
これが誰かの役に立つことを願っています。 これについてもっと読む 。
この記事 は、RSpecで並べ替え順序をテストするいくつかの方法をリストしています。
RSpec::Matchers.define :appear_before do |later_content|
match do |earlier_content|
page.body.index(earlier_content) < page.body.index(later_content)
end
end
私は最近同じ問題を抱えており、このきちんとした理想的な解決策を見つけました: http://launchware.com/articles/acceptance-testing-asserting-sort-order
小さな宝石としてパッケージ化されています。
このページには、ページ内の文字列要素の順序をテストする非常に巧妙な方法があります。
https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara
これはキュウリのステップの形式ですが、Rspecステップに必要なものを抽出できるはずです。これはジョンズの「無愛想な」ソリューションに似ていますが、私が理解できることから少し精巧です。他のすべての狡猾なカピバラのテスト手順はここにあります:
all Finderメソッドを使用して複数の要素を選択し、collectを使用してテキストを配列に引き出すことができます。
assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']
ポップアップナビゲーションメニューなど、ページにリストが表示されない場合は、visible: false
をall
メソッドに渡す必要があります。
上記のソリューションでは、ページに複数の要素がある場合、順序をテストすることは非常に困難でした。だから、私は別の方法を見つけました。
私はここに解決策を投稿しました- カピバラを使用したコンテンツのテスト順序(シーケンス)
Css固有の要素を持つ配列をマッピングし、その配列を予想される配列と一致させます(要素を順番に保持します)
capybara-ui を使用すると、#widgets
メソッドを使用して、すべての要素をトップダウンの順序で取得します。
# First define the widget,
# or reusable dom element reference.
# In this case in a role
class UserRole < Capybara::UI::Role
widget :list_item, '.list-item'
end
# Then test the expected order using #widgets
role = UserRole.new
expected_order = ['buy milk', 'get gas', 'call dad']
actual_order = role.widgets(:list_item).map(&:text)
expect(actual_order).to eq(expected_order)