QA@IT
«質問へ戻る

サンプルを手書きで書き換えてる間に間違えた。。

1138
本文
 Failures:
 
   1) Check word show the word page
-     Failure/Error: page.should have_content /Total \(\d+\)/m
-       expected there to be content "(?m-ix:Total \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
+     Failure/Error: page.should have_content /Next \(\d+\)/m
+       expected there to be content "(?m-ix:Next \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
      # ./spec/requests/word_spec.rb:11:in `block (2 levels) in <top (required)>'
 
 Finished in 1.52 seconds

Capybaraの have_content は正規表現を受け付けない?

Ruby on Railsアプリのテストに RSpec、Capybara を使っていて、以下のように書きました。

  scenario 'show the word page' do
    visit word_path(Word.last)
    page.should have_content 'Welcome page'
    page.should have_content /Next \(\d+\)/m

Next (100) とか、Next (98) という風に動的に統計値が変わるメッセージにマッチさせようという意図です。そこの数値がいくつであっても構わないので、数字でありさえすればいいということです。

ところが、以下のようにエラーが出ます。

Failures:

  1) Check word show the word page
     Failure/Error: page.should have_content /Next \(\d+\)/m
       expected there to be content "(?m-ix:Next \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
     # ./spec/requests/word_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 1.52 seconds
1 example, 1 failure

同類のテストフレームワークである Webrat のマッチャでは、以下のようにテキストと正規表現を受け付けます。

# File 'lib/webrat/core/matchers/have_content.rb', line 9

def matches?(stringlike)
   @document  = Webrat::XML.document(stringlike)
   @element  =  @document .inner_text

  case  @content 
  when String
     @element .gsub(/\s+/, ' ').include?( @content )
  when Regexp
     @element .match( @content )
  end
end

一方、Capybara は、

# capybara/rspec/matchers.rb

    def have_content(text)
      HaveMatcher.new(:content, text.to_s) do |page, matcher|
        %(expected there to be content #{matcher.locator.inspect} in #{page.text.inspect})
      end
    end

のように、正規表現を渡しても to_s とテキストに変換してしまうようです。

正規表現があったほうが便利に思えるのですが、これはプラクティスとして好ましくないという Capybara の設計思想なのでしょうか(というのはここで聞いても仕方ないかもしれませんが)。また、こういう場合は正規表現を使わずに書くのが正解でしょうか?

Ruby on Railsアプリのテストに RSpec、Capybara を使っていて、以下のように書きました。

~~~ruby
  scenario 'show the word page' do
    visit word_path(Word.last)
    page.should have_content 'Welcome page'
    page.should have_content /Next \(\d+\)/m
~~~

Next (100) とか、Next (98) という風に動的に統計値が変わるメッセージにマッチさせようという意図です。そこの数値がいくつであっても構わないので、数字でありさえすればいいということです。

ところが、以下のようにエラーが出ます。

~~~
Failures:

  1) Check word show the word page
     Failure/Error: page.should have_content /Next \(\d+\)/m
       expected there to be content "(?m-ix:Next \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
     # ./spec/requests/word_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 1.52 seconds
1 example, 1 failure
~~~

同類のテストフレームワークである Webrat のマッチャでは、以下のようにテキストと正規表現を受け付けます。

~~~ruby
# File 'lib/webrat/core/matchers/have_content.rb', line 9

def matches?(stringlike)
   @document  = Webrat::XML.document(stringlike)
   @element  =  @document .inner_text

  case  @content 
  when String
     @element .gsub(/\s+/, ' ').include?( @content )
  when Regexp
     @element .match( @content )
  end
end
~~~

一方、Capybara は、

~~~
# capybara/rspec/matchers.rb

    def have_content(text)
      HaveMatcher.new(:content, text.to_s) do |page, matcher|
        %(expected there to be content #{matcher.locator.inspect} in #{page.text.inspect})
      end
    end
~~~

のように、正規表現を渡しても to_s とテキストに変換してしまうようです。

正規表現があったほうが便利に思えるのですが、これはプラクティスとして好ましくないという Capybara の設計思想なのでしょうか(というのはここで聞いても仕方ないかもしれませんが)。また、こういう場合は正規表現を使わずに書くのが正解でしょうか?

質問を投稿

Capybaraの have_content は正規表現を受け付けない?

Ruby on Railsアプリのテストに RSpec、Capybara を使っていて、以下のように書きました。

  scenario 'show the word page' do
    visit word_path(Word.last)
    page.should have_content 'Welcome page'
    page.should have_content /Next \(\d+\)/m

Next (100) とか、Next (98) という風に動的に統計値が変わるメッセージにマッチさせようという意図です。そこの数値がいくつであっても構わないので、数字でありさえすればいいということです。

ところが、以下のようにエラーが出ます。

Failures:

  1) Check word show the word page
     Failure/Error: page.should have_content /Total \(\d+\)/m
       expected there to be content "(?m-ix:Total \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
     # ./spec/requests/word_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 1.52 seconds
1 example, 1 failure

同類のテストフレームワークである Webrat のマッチャでは、以下のようにテキストと正規表現を受け付けます。

# File 'lib/webrat/core/matchers/have_content.rb', line 9

def matches?(stringlike)
   @document  = Webrat::XML.document(stringlike)
   @element  =  @document .inner_text

  case  @content 
  when String
     @element .gsub(/\s+/, ' ').include?( @content )
  when Regexp
     @element .match( @content )
  end
end

一方、Capybara は、

# capybara/rspec/matchers.rb

    def have_content(text)
      HaveMatcher.new(:content, text.to_s) do |page, matcher|
        %(expected there to be content #{matcher.locator.inspect} in #{page.text.inspect})
      end
    end

のように、正規表現を渡しても to_s とテキストに変換してしまうようです。

正規表現があったほうが便利に思えるのですが、これはプラクティスとして好ましくないという Capybara の設計思想なのでしょうか(というのはここで聞いても仕方ないかもしれませんが)。また、こういう場合は正規表現を使わずに書くのが正解でしょうか?

Ruby on Railsアプリのテストに RSpec、Capybara を使っていて、以下のように書きました。

~~~ruby
  scenario 'show the word page' do
    visit word_path(Word.last)
    page.should have_content 'Welcome page'
    page.should have_content /Next \(\d+\)/m
~~~

Next (100) とか、Next (98) という風に動的に統計値が変わるメッセージにマッチさせようという意図です。そこの数値がいくつであっても構わないので、数字でありさえすればいいということです。

ところが、以下のようにエラーが出ます。

~~~
Failures:

  1) Check word show the word page
     Failure/Error: page.should have_content /Total \(\d+\)/m
       expected there to be content "(?m-ix:Total \\(\\d+\\))" in "Reijiro\n\n\n\nReijiro\n\nNext (100)\n\n\nClips (100/100)\n\n\nLevels\n\n\nStats\n\n\nDone today: 0\n\n\n\n\n\n\n\n\n\n\n\n\nLevel:\n0\n\n\nLast checked:\nless than a minute ago\nClipped:\nless than a minute ago\n\n\nPronunciation\n\n\nWiktionary\n\n\nGoogle\n\n\nNYT\n\n\nword100\n\n\nCheck and proceed\nEdit\nDelete\n\n\n0\n\n\n\nNew\n1 Day\n2 Days\n4 Days\n1 Week\n2 Weeks\n1 Month\n2 Months\nDone\n\n\n\nnone\n\nThesaurus.com\n\n\n\n■apple : りんご\n\nCheck and proceed\nBack to top\n\n\n\n\n\n"
     # ./spec/requests/word_spec.rb:11:in `block (2 levels) in <top (required)>'

Finished in 1.52 seconds
1 example, 1 failure
~~~

同類のテストフレームワークである Webrat のマッチャでは、以下のようにテキストと正規表現を受け付けます。

~~~ruby
# File 'lib/webrat/core/matchers/have_content.rb', line 9

def matches?(stringlike)
   @document  = Webrat::XML.document(stringlike)
   @element  =  @document .inner_text

  case  @content 
  when String
     @element .gsub(/\s+/, ' ').include?( @content )
  when Regexp
     @element .match( @content )
  end
end
~~~

一方、Capybara は、

~~~
# capybara/rspec/matchers.rb

    def have_content(text)
      HaveMatcher.new(:content, text.to_s) do |page, matcher|
        %(expected there to be content #{matcher.locator.inspect} in #{page.text.inspect})
      end
    end
~~~

のように、正規表現を渡しても to_s とテキストに変換してしまうようです。

正規表現があったほうが便利に思えるのですが、これはプラクティスとして好ましくないという Capybara の設計思想なのでしょうか(というのはここで聞いても仕方ないかもしれませんが)。また、こういう場合は正規表現を使わずに書くのが正解でしょうか?