2016-08-15 7 views
2

多くの場合と同様に、私はCapybaraを使用してフィーチャー仕様をテストするだけでなく、Rails Viewの仕様でレンダリングされたHTMLもテストします。RailsでCapybaraのスコープヘルパーを使用するView Specs

私はカピバラノードにレンダリングされたHTMLを包む -

require "spec_helper" 

RSpec.describe "foo/show.html.erb", type: :view do 
    it "should display foo" do 
    render 

    within(".some-class") do 
     expect(page).to have_content("woohoo") 
    end 
    end 

    def page 
    @page ||= Capybara::Node::Simple.new(rendered) 
    end 
end 

を彼らが実際に(偽陽性)失敗しなければならないときしかし、私は最近、(上記と同様の形式の)いくつかのテスト合格に気づきました。

私はそれをwithin do ... endブロックの動作まで追跡しました。私の表示仕様ではブロックを実行しません。ブロックwithin内のbinding.pryで実行を一時停止しようとしましたが、決して起動しませんでした。そして、決して実行しないので、すべての仕様はうまくいっています。

withinCapybara Session methodです。「セッション」がないので、表示仕様では動作しません。

  1. withinへの呼び出しが黙って失敗する理由がわかりましたか?何をwithinメソッドが呼び出すのですか?それが見つからないとエラーを投げないのはなぜですか?

  2. ビュースペックでここで動作させる方法はありますか?複雑なレンダリングされたHTMLで、それはあなたのテストがwithinの全体のポイントである特定のHTMLノードにスコープ持っていることが信じられないほど便利ですので、私はそれを

感謝を使用することができるのが大好きです!デフォルトでは

答えて

4

のみカピバラ:: RSpecMatchersがビューの仕様に含まれなければならない - カピバラwithinので(何であるかのライブラリを参照するbyebugを使用して、コールの中に足を踏み入れるてみ利用可能であるべきではない、ではなく、カピバラ:: DSL - https://github.com/jnicklas/capybara/blob/master/lib/capybara/rspec.rb#L10それを提供する)。簡単に見てとった後、withinあなたが実際にしている:ので、何か

page = Capybara.string(rendered) 
scoped_node = page.find(".some-class") 
expect(scoped_node).to have_content("woohoo") 
expect(scoped_node.find('.contained-class')).to have_content("abcdefg") 

などのアップデート - あなたは/ファインダーは、ノード上で呼び出すことができマッチャーとそれが使用されるノードにスコープ事実を使用して、スコープ、あなたのテストができます呼び出しはおそらく何らかの理由でRSpec be_within matcherであり、 within - https://github.com/rspec/rspec-expectations/blob/3-5-maintenance/lib/rspec/matchers.rb#L416というようにエイリアス化されています。なぜそれが期待通りに読み込まれるかを考えることができないのはなぜか分からず、基本的にはすべてのステートメントは、それに渡されたブロックを無視することはありません。

+0

ありがとうTom!これは今や理にかなっており、その行動を直接説明します。自分の好奇心のために、Capybara :: DSLをビューのスペックに含めない理由は何ですか?そのライブラリは実際のWebブラウザを駆動するので、仕様を見るには適用されず、単純なHTMLをレンダリングするだけですか?恥ずかしがり屋の中で '()'はそんなに役立つヘルパーなのですから! – user2490003

+0

@ user2490003修正 - Capybara :: DSLはブラウザを駆動するセッションメソッドで構成されていますが、これは表示仕様では意味をなさないものです。現在の 'page'の' find'の結果を(渡されたargsとともに)スタックにプッシュし、 'page'を定義するだけで、あなたのビュー仕様のための独自の' within'メソッドを書くことができるはずですスタックの先頭、または現在定義されているページがない場合は 'Capybara.string(rendered)'。 –

+0

完璧で、さらに良いアイデアです。再度、感謝します。 – user2490003

関連する問題