web-dev-qa-db-ja.com

RSpec / Capybaraを介して要素の順序をテストすることは可能ですか?

テストスイートとして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")')

注文をテストする別の方法を知っている人はいますか?

40
John

この問題は、ページの本文コンテンツに対する正規表現の一致をテストすることで解決しました。少し賢いですが、それは動作します。

page.body.should =~ /ITEM1.*ITEM2.*ITEM3/
34
John

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")
_

これが誰かの役に立つことを願っています。 これについてもっと読む

29
dgilperez

この記事 は、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
27
Finn MacCool

私は最近同じ問題を抱えており、このきちんとした理想的な解決策を見つけました: http://launchware.com/articles/acceptance-testing-asserting-sort-order

小さな宝石としてパッケージ化されています。

4
TomTaila

このページには、ページ内の文字列要素の順序をテストする非常に巧妙な方法があります。

https://makandracards.com/makandra/789-match-strings-in-a-given-order-with-cucumber-and-capybara

これはキュウリのステップの形式ですが、Rspecステップに必要なものを抽出できるはずです。これはジョンズの「無愛想な」ソリューションに似ていますが、私が理解できることから少し精巧です。他のすべての狡猾なカピバラのテスト手順はここにあります:

https://github.com/makandra/spreewald

2
charlesdeb

all Finderメソッドを使用して複数の要素を選択し、collectを使用してテキストを配列に引き出すことができます。

assert_equal page.all('#navigation ul li').collect(&:text), ['Item 1', 'Item 2', 'Item 3']

ポップアップナビゲーションメニューなど、ページにリストが表示されない場合は、visible: falseallメソッドに渡す必要があります。

2
Jay P.

前述の article の作者が書いたorderlygem を使用してください。

それは次のように簡単です:

expect(this).to appear_before(that)
1
Jan Klimo

上記のソリューションでは、ページに複数の要素がある場合、順序をテストすることは非常に困難でした。だから、私は別の方法を見つけました。

私はここに解決策を投稿しました- カピバラを使用したコンテンツのテスト順序(シーケンス)

Css固有の要素を持つ配列をマッピングし、その配列を予想される配列と一致させます(要素を順番に保持します)

0
rhunal

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)
0
steel