如何测试ransack输出? Rspec的

时间:2015-06-01 07:18:39

标签: ruby-on-rails ruby rspec ransack

我在这里遇到了一些问题,希望你帮助我。我有一张表中的酒店列表。 这是一个观点:

<% provide(:title, 'List of hotels') %>
<h1>List of hotels</h1>

<table>
  <tr>
    <th><%= sort_link @search, :name, "Name" %></th>
    <th><%= sort_link @search, :breakfast, "Breakfast" %></th>
    <th><%= sort_link @search, :price_for_room, "Price for room" %></th>
    <th><%= sort_link @search, :star_rating, "Star Rating" %></th>
    <th><%= sort_link @search, :average_rating, "Average Rating" %></th>
    <th><%= sort_link @search, :aasm_state, "State" %></th>
  </tr>
  <% @hotels.each do |hotel| %>
  <tr>
    <td><%= link_to ""+hotel.name, controller: "hotels", action: "show", id: hotel %></td>
    <td><%= hotel.breakfast %></td>
    <td><%= hotel.price_for_room %></td>
    <td><%= hotel.star_rating %></td>
    <td><%= hotel.average_rating %></td>
    <td><%= hotel.aasm_state %></td>
  </tr>
  <% end %>
</table>

我添加了用户按名称,价格等对其进行排序的能力。感谢Ransack gem。但问题是我不知道如何测试这个输出。我写了一些测试,但我不知道接下来要做什么。 规范文件: 需要'spec_helper'

describe "Admin"  do
    ...

    it { expect(page).to have_link("Name") }
    it { expect(page).to have_link("Breakfast") }
    it { expect(page).to have_link("Price for room") }
    it { expect(page).to have_link("Star Rating") }
    it { expect(page).to have_link("Average Rating") }
    it { expect(page).to have_link("State") }

    ...

如何测试排序并可能过滤结果?感谢。

  

Rails 4.0.8 ruby 1.9.3p551 gem ransack最新版本   矩

1 个答案:

答案 0 :(得分:1)

测试通常有三个阶段:设置,执行,断言。

设置阶段将创建一些酒店,这些酒店对于您正在测试的方面具有不同的属性。

执行阶段将点击对酒店进行排序的链接。

断言阶段将检查页面上的元素,以验证它们的顺序是否正确。

所以你最终会得到这样的东西:

# setup (using FactoryGirl or similar)
# note how these are intentionally not sorted
create(:hotel, name: "Hotel C")
create(:hotel, name: "Hotel A")
create(:hotel, name: "Hotel B")

# execute
visit hotels_path
click_link "Name"

# assert
hotel_names = page.all("td.hotel-name").map(&:text)
expect(hotel_names).to eq ["Hotel A", "Hotel B", "Hotel C"]