2017-01-29 27 views
0

よろしいですか、わかりました。私は機能仕様を持っており、それは通過していません。 deletting_posts_spec.rbが "Post was successfully destroyed"というテキストを見つけられませんでした。私はページを検査して、私のlocalhost上で、成功通知のテキストが確実にそこにあります。私はbyebugを挿入しようとしました。そして、私がpage.bodyを実行したときに、byebugの中で通知のコードを見ることができました。そして、実際に何かを削除したとき、私はその通知を見ることができます。奇妙な部分は、私はcreating_postsのための別のテストがあり、成功の通知が表示され、テストに合格します。Capybara have_content()が期待通りに表示されない

奇妙な、右?

以前は奇妙なエラーの原因となっていたため、ターボリンクがありません。私はコントローラーのリダイレクトも取り出しましたが、まだ通知はありません。私は最近更新されたバンドルですが、まだ失敗しています。私のルビーバージョンは2.3.1、RSpecは3.5.4です。

追加情報が必要な場合はお知らせください。

マイエラー

Deleting Posts admins can delete posts 
    Failure/Error: expect(page).to have_content "Post was successfully destroyed." 
     expected to find text "Post was successfully destroyed." in "Listing All Posts Content Author Actions Post Something" 

更新!私はdelete specで自分のコードを変更しましたが、私はまだ同じ失敗を得ています。私は元々は参考にしていたものをコメントしました。

deleting_posts_spec.rb

RSpec.feature "Deleting Posts" do 
    let(:administrator) {Administrator.create(name: "My Name", email: "[email protected]", password: "password")} 

    let(:post) {Post.create!(content: "The Content created", votes: 1, story: "My story", author: "A Name")} 

    scenario "admins can delete posts" do 
    login(administrator) 

    click_link "Admin Page" 

    #page.all("tr.the-actions").each do |tr| 
     click_on "Delete" if page.has_selector?('a[href*="delete-link"]') 
     #.to change(Post, :count).by(-1) 
    #end 

    expect(page.current_path).to eq(admin_posts_path) 
    expect(page).to have_content "Post was successfully destroyed." 
    end 
end 

管理/ posts_controller.rb

def destroy                                
    if @post.destroy 
    redirect_to admin_posts_path 
    flash[:notice] = 'Post was successfully destroyed.' 
    end 
end 

ビュー/管理/ポスト/ index.html.erb

<p id="notice"><%= notice %></p>                           

<script type="text/javascript"> 
    $(document).ready(function(){ 
    setTimeout(function(){ 
     $('#notice').remove(); 
    }, 2000); 
    }) 
</script> 

<center><h1>Listing All Posts</h1></center> 

    ... 
    stuff 
    ... 

    <% @posts.each do |post| %> 
    <tr class="the-actions"> 
     <td><center><%= post.content %></center></td> 
     <td><center><%= link_to post.author, post_path(post.id) %></center></td> 
     <td class="actions-column"> 
     <%= link_to 'Show', post %> &middot; 
     <%= link_to 'Edit', [:edit, :admin, post], class: "edit-link" %> &middot; 
     <%= link_to 'Delete', [:admin, post], method: 'delete', confirm: 'Are you sure you want to delete this post?', class: "delete-  link" %>                                 
     </td> 
    </tr> 
    <% end %> 
+0

は競合状態になる可能性があります。 ) '' expect(page.current_path).to eq(admin_posts_path)の後に ''そうでない場合は、 'selenium'で試して、メッセージが実際にポップアップするかどうかを確認するためにスリープコールを続けます。最後の手段は、 'tail -f log/test.log'でDELETEが失敗するかどうかを確認することです。 –

+0

@Dimitry_N素早く応答してくれてありがとう!私は '' sleep(5) ''を試みましたが、動作しませんでした。私は今あなたの他の提案を試みています。 – kyle

+0

あなたはテストで 'if page.has_selector? 'を持っていますが、ページに' Delete'リンク/ボタンがあるかどうかを知るべきです。そうしないと、テストは無意味です。さらに、current_pathで 'eq'マッチャーを使用しないでください。 - have_current_pathマッチャー' expect(page).to have_current_path(admin_posts_path) 'を使用してください。それ以外にあなたはどんなドライバーを使っていますか? JS対応ドライバを使用している場合、リンクをクリックするとポップアップする確認ボックスを処理する必要があります –

答えて

1

私が持つ上記のコメントを追加しましたあなたのテストに関するいくつかのコメントが、私はそれが動作していない主な理由は、Postオブジェクトが実際にはないcrだと思うあなたがそのページに行くときに食べた。 letを使用すると、オブジェクトは最初に参照するときに遅延して作成されますが、テストでは決してpostを参照しないので、決して作成されません。代わりに

let!(:post) {Post.create!(content: "The Content created", votes: 1, story: "My story", author: "A Name")} 

let!を使用することにより、常にオブジェクトを作成れることを修正することができます。これは、Capybaraが「削除」リンク/ボタンを見つけられなかったため、if page.has_selector?('a[href*="delete-link"]')コードをテストしていないと明らかになります。

+0

はい!それだった!私の誤解は、「削除」が列にあるので、それをクリックするために 'page.has_selector? 'を使用しなければならないということでした。あなたのソリューションで、それはパスします!説明してくれてありがとう。私は 'let 'と' let!'にかなり新しいです。 – kyle

+0

すべての 'page.has_selector?'は、一致する要素が存在するかどうかに基づいてtrueまたはfalseを返します。すべてのデータを管理し、要素がそこに存在するかどうかを知っておく必要があるため、アプリをテストするときはほとんど使用しないでください。カピバラを使用してスクレーパーのようなものを書く場合は主に使用されます。 –

+0

どうもありがとうございました! – kyle

関連する問題