2017-01-05 8 views
0
describe 'Destroy Student Record' do 
     it 'should allow to Delete My student', js: true do 
      expect { 
      find('.icon-delete',"a[href ='/room/grade3/#{@student.id}']").click 
      page.find('.btn.delete', text: 'Sure').click 
      }.to change(Student, :count).by(-1) 
     end 
     end 

をクリックするための組み合わせ検索を行うが、問題は2つのレコードが自分のしているとき、それは、削除が.icon-曖昧であることを示しているということであり、また、削除やビューの詳細について同じであるてhrefする方法もhrefのためのそうそれはあいまいである。 私はHTMLとの組み合わせ検索インクCypabara RSPEC

+0

findは2つの文字列を受け取りません - 実際に表示しようとしているHTMLを表示します –

+0

jerrytom

答えて

2

を行うことができますどのように

<a href="/room/grade3/10036" class="btn" title="Delete"> 
    <i class="icon-delete"></i> 
</a> 

クリックする複数の方法がある - ちょうどリンクをクリックするようclick_linkは、リンクのID、テキスト、またはタイトルに一致しますがあなたは私が>要素は、あなたが

find_link('Delete', href: "/room/grade3/#{@student.id}").find('.icon-delete').click 
find("a[href ='/room/grade3/#{@student.id}'] i.icon-delete").click 
のいずれかを行うことができ<に特にクリックする必要がある場合は、

click_link('Delete', href: "/room/grade3/#{@student.id}") 

を行うことができます

注:これらの修正でも、テストが失敗する可能性があります。これは、changeマッチャーを使用していて、ブロックが何もしていないために、変更マッチャーがスチューデントカウントを再度チェックする前にアクションが完了したことを確認するためです。これは、JSサポートドライバclickのいずれかを使用するとボタンをクリックするだけで、待機する副作用についてはわからず、アプリがオフになっている間にテストに戻り、クリックがトリガーする動作を処理し始めるからです。あなたのテストは、生徒が実際に削除され、changeマッチャは学生が再びカウントを得ることができるまでのコードが遅れることになります。この方法で

expect { 
    ... Do whatever clicking of link/button ... 
    expect(page).to have_text("Student deleted") # whatever message is shown once the student is actually deleted or an assertion for other visible change 
}.to change(Student, :count).by(-1) 

のようなものである必要があることを修正します。