QA@IT

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

3819 PV

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 の設計思想なのでしょうか(というのはここで聞いても仕方ないかもしれませんが)。また、こういう場合は正規表現を使わずに書くのが正解でしょうか?

回答

ウォッチ

この質問への回答やコメントをメールでお知らせします。