多くの場合と同様に、私は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
で実行を一時停止しようとしましたが、決して起動しませんでした。そして、決して実行しないので、すべての仕様はうまくいっています。
within
はCapybara Session methodです。「セッション」がないので、表示仕様では動作しません。
within
への呼び出しが黙って失敗する理由がわかりましたか?何をwithin
メソッドが呼び出すのですか?それが見つからないとエラーを投げないのはなぜですか?ビュースペックでここで動作させる方法はありますか?複雑なレンダリングされたHTMLで、それはあなたのテストが
within
の全体のポイントである特定のHTMLノードにスコープ持っていることが信じられないほど便利ですので、私はそれを
感謝を使用することができるのが大好きです!デフォルトでは
ありがとうTom!これは今や理にかなっており、その行動を直接説明します。自分の好奇心のために、Capybara :: DSLをビューのスペックに含めない理由は何ですか?そのライブラリは実際のWebブラウザを駆動するので、仕様を見るには適用されず、単純なHTMLをレンダリングするだけですか?恥ずかしがり屋の中で '()'はそんなに役立つヘルパーなのですから! – user2490003
@ user2490003修正 - Capybara :: DSLはブラウザを駆動するセッションメソッドで構成されていますが、これは表示仕様では意味をなさないものです。現在の 'page'の' find'の結果を(渡されたargsとともに)スタックにプッシュし、 'page'を定義するだけで、あなたのビュー仕様のための独自の' within'メソッドを書くことができるはずですスタックの先頭、または現在定義されているページがない場合は 'Capybara.string(rendered)'。 –
完璧で、さらに良いアイデアです。再度、感謝します。 – user2490003