RSpecでdata-confirmのOKかキャンセルを選択する方法

はじめに

RSpecのテストコードで、data-confirmのOKかキャンセルを選択する方法について

テストするビューの一部

まず、以下のようなtask一覧ページのビューがあるとします。

  <tbody class='task_list'>
    <% @tasks.each do |task| %>
      <tr>
        <td><%= task.title %></td>
        <td><%= task.status %></td>
        <td><%= short_time(task.deadline) if task.deadline? %></td>
        <td><%= link_to 'Show', [@project, task] %></td>
        <td><%= link_to 'Edit', edit_project_task_path(@project, task) %></td>
        <td><%= link_to 'Destroy', [@project, task], method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>

上記の「<%= link_to 'Destroy'・・・」の部分に注目してください。

これは'Destroy'というリンクをクリックした時に、'Are you sure?'という確認ダイアログが出て、「OK」か「キャンセル」かを選べるようになります。

今回はこの部分に関して、テストによって「OK」か「キャンセル」かを選択したいときの方法について解説します。

RSpecでdata-confirmのOKを選択する方法

2通りの方法があります。

 1つ目の方法

一つ目の方法は、click_linkなどの後に下記のようなメソッドを入れる方法です。

  click_link 'Destroy'
  page.driver.browser.switch_to.alert.accept

 2つ目の方法

2つ目の方法は、capybaraで用意されている「accept_confirm」を利用する方法です。

page.accept_confirm do
  click_link 'Destroy'
end

RSpecでdata-confirmのキャンセルを選択する方法

続いて、キャンセルを選択する方法です。

こちらは先程の「accept」の部分を「dismiss」に変えるだけです。

click_link 'Destroy'
page.driver.browser.switch_to.alert.dismiss  
page.dismiss_confirm do
  click_link 'Destroy'
end