2011-05-24 4 views
1

私はrspecの統合テストを書いていますが、リンクをクリックすると正しいモデルページに移動することをテストしたいと思います。具体的には、同じ名前で異なるURLのリンクのリストでこれをテストしたいと思います。特定のリンクをhrefで選択する

これまでに学んだことは、特定のテキストまたはDOM IDのみを検索するため、click_linkでCSS属性セレクタを使用することはできません。代わりに私はwebrat withinメソッドを使用しようとしていますが、一度リンクを選択するとどのようにクリックしますか?私は、リンクの範囲内link.clickが働くと考えましたが、それは方法clickが定義されていないと言って失敗します。

Failure/Error: link.click 
NoMethodError: 
    undefined method `click' for #<Webrat::Scope:0x0000010505ae00> 

ここに私のテストです:

require 'spec_helper' 

describe "BrandLinks" do 
    before(:each) do 
    @base_title = "My App - " 

    @brand = Factory(:brand) 
    second = Factory(:brand) # <= Same name, different slug 
    third = Factory(:brand, :name => "Awesome USA Brand!!") 
    @brands = [@brand, second, third] 
    end 

    it "should show me the brand page when I click on a brand link" do 
    get '/brands' 
    within "a[href=#{brand_path(@brand)}]" do |link| 
     link.click 
    end 
    response.should be_success 
    response.should have_selector(
     "title", 
     :content => "#{@base_title}Brand - #{@brand.name}" 
    ) 
    end 
end 
+0

ここで一見明らかなのは、リンクの親ノードを選択できるように、セレクタをページに追加するだけです。この時点で私がこれをやろうとしたら、この1つのテストに合格するためにセレクタをページに追加するだけです。私はそれを避けたい。 –

+0

同僚は私の前のコメントについて次のように言っていました。「[いつ]コードをテストするのは簡単ですが、しばしばアーキテクチャが一貫して切り離されているという兆候です。純粋にテスト容易性のためにコードを変更/リファクタリングしました。実際にコードを複雑にした場合は、これを行うことにはもっと注意が必要ですが、idをhtml要素に追加すると、技術的な負債が増えることはありません。それがコードをよりテスト可能にするなら、私はそれを求めて行くだろう。その要素がそこにあることをテストするのに十分な重要性を持っているならば、それをIDやクラスに与えることは大丈夫でしょう。」と言われました –

+0

しかし、私はまだ私が試みていることが可能かどうかを知りたいと思います。 –

答えて

0

あなたはclick_link_withinを試みたことがありますか?ドキュメントによると

Works like click_link, but only looks for the link text within a given selector

+0

私は同じ問題に直面するように聞こえます。見つかる唯一のセレクタは、リンク自体のhrefです。私はそれを試してみましょう。 –

+0

Webrat :: NotFoundError:テキストまたはタイトルまたはIDを持つリンクを見つけることができませんでした。「Super_Click_link_within」で失敗しました。ブランドA ""なので、そのリンク内のリンクを探す必要があります。 –

+0

これはxpathで動作するはずですが、明らかにwebratにバグがあります。私はそれが修正されているかわからないが、ここにいくつかの情報と回避策がありますhttps://webrat.lighthouseapp.com/projects/10503-webrat/tickets/153-within-should-support-xpath – Dty

0

最初に、エラーメッセージは.clickメソッドが定義されていないことです。代わりに.click_linkを試してください。

リンクのテキストも必要です。つまり、withinはスコープを定義し、click_linkはそのスコープ内をクリックするリンクを指示します。

within "a[href=#{brand_path(@brand)}]" do |scope| # within a specific <a> tag 
    scope.click_link @brand # click on @brand text 
end 

click_link_within内のプラスclick_linkのショートカットですので、これは上記と同じでなければなりません:

click_link_within "a[href=#{brand_path(@brand)}]", @brand 

私はまだwithinセレクタがどのようにしている(自分自身をどのように機能するかを理解しようとしていますこの質問が見つかりました!)。ここで私はこれまで持っているものです:

Webrat Sessionオブジェクトのwithin method@selector = selectorで新しいセッションを作成し、それがScope.from_scopeにセレクタを渡すことにより、スタックに新しいスコープをプッシュするために使用するselector引数を取ります。今のところ私はselectorの定義を見つけることができません。この2009 blog postは、セレクタにはCSSの型、クラス、IDを指定できますが、ソースの引用はしていません。

関連する問題