0

投稿モデルとタグモデルの間には多対多の関連があり ます。次に、投稿ビューに次のように表示されます。

posts / show.html.erb:

<p><%= raw @post.tags.map { |t| link_to t.name, tag_path(t.name) }.join(', ') %></p>

これは私が書いた仕様です:

post_pages_spec.rb:

  describe "show page" do
    let!(:post) { FactoryGirl.create(:post, user:        user,
                                            title:       "Lorem",
                                            content:     "Lorem ipsum",
                                            category_id: category.id,
                                            tag_list:     "#{tag.id}") }

    before do 
      sign_in user
      visit post_path(post)
    end

    it { should have_selector('h1',       text: post.title) }
    it { should have_selector('title',    text: post.title) }
    it { should have_link(post.user.name, href: user_path(user)) }
    it { should have_selector('p',        text: post.content) }
    it { should have_selector('p',        text: post.category.name) }
    it { find("p").should have_content(post.tags.map { |t| t.name }.join(", ")) }
    .
    .
    .

このエラーが発生します:

失敗:

1)投稿ページの表示ページの失敗/エラー:it {find( "p")。should have_content(post.tags.map {| t | t.name} .join( "、"))}コンテンツがあると予想される " 1、tag28 "in" Lorem ipsum "#./ spec/requests/post_pages_spec.rb:28:in`ブロック(3レベル)in '

コードは実際のサイトで機能しますが、ご覧のとおり、仕様は失敗しています。この仕様を書く正しい方法は何ですか?

編集:

ポストモデルの例(念のため):

class Post < ActiveRecord::Base
  include ActionView::Helpers

  attr_accessible :title, :content, :category_id, :tag_list

  has_many :taggings, :dependent => :destroy  
  has_many :tags, :through => :taggings
  .
  .
  .

ライブサイトからの出力:

  <p><a href="/tags/inkscape">inkscape</a>, <a href="/tags/gimp">gimp</a></p>
4

2 に答える 2

1

アップデート

コメントスレッドから、をfind単純なhave_selectorパスに置き換えることがわかりました。

it { should have_selector('p', text: post.tags.map { |t| t.name }.join(", ")) }

なぜ機能しないのかは明らかでfind('p').should have_content(...)はありません。<p>同じタイプのビュー(リンクのリストをラップするタグを使用)をテストしたところ、find('p').should ...パターンが正常に機能することがわかったため、コードで何かおかしなことが起こっています。have_contentこれは、以下で説明するCapybara2.0の問題に関連している場合と関連していない場合があります。

誰かアイデアがあれば共有してください!これは私が提供できる最高のものです。

元の回答

Capybara 2.0の新しいテキストマッチャーは、表示されていないコンテンツを除外し、やや直感的でない結果を生成します。

it { should have_selector('title', text: 'Some Title') } # <= fails
it { should have_selector('title') }                     # <= passes
it { should have_text('Some Title') }                    # <= passes

そして、この質問のケースに関連して、これ

find("title").should have_content("some text") # <= fails

この投稿も参照してください:Capybara 2.0でページタイトルをテストするにはどうすればよいですか?

page.body.should ...が機能しているがpage.should ...(または別の形式で)機能していない場合subject { page} ; it { should ... }は、おそらくこれが問題です。これはpage.bodyHTML文字列であるのに対し、は完全に異なることに注意してください。ただし、Capybara 2.0では、少なくともどちらに対しても期待を裏切ることができます。私はすべてのHTMLを含んでいると思うので、可視性の問題を回避します。pageCapybara::Sessionpage.body

于 2012-11-29T12:07:27.793 に答える
1

it { ... }仕様に構成を使用する場合は、it次のように上部で定義する必要があります。

subject { page }

リクエストスペックのデフォルトの件名を思い出せませんが、通常はsubject説明どおりに定義します。

于 2012-11-29T11:50:37.920 に答える