Тест Rspec не проходит, отсутствует проблема формата шаблона - PullRequest
2 голосов
/ 15 марта 2011

Я пытаюсь реализовать некоторые интеграционные тесты для моего приложения, чтобы протестировать систему голосования, которая у меня есть, но столкнулась с некоторыми проблемами. Прежде всего, вот тестовый код, который я пытаюсь пройти:

describe "vote_up_user" do

it "should update the user rating" do
  click_link "user_up_arrow"
  response.should have_selector("#user_rating", :content => "1")
end
end

Вот ссылка, по которой нажимают:

<%= link_to image_tag("uparrowbig.png"), vote_up_user_path(@user), :method => :post,
        :id => "user_up_arrow", :class => "arrow", :remote => true %>

Соответствующее действие:

respond_to :html, :js

def vote_up_user
  @voted_on_user = User.find(params[:id])
  current_user.vote_exclusively_for(@voted_on_user)
  respond_with(@voted_on_user, :location => user_path(@voted_on_user))
end

и, если кому-то интересно, соответствующие голоса / voice_up_user.js.erb:

$("user_rating").update('<%= @voted_on_user.plusminus.to_s %>')
$("user_up_arrow").update('<%= image_tag("uparrowbigselect.png") %>')
$("user_down_arrow").update('<%= image_tag("downarrowbig.png") %>')

Моя проблема в том, что я продолжаю приводить к сбою в строке click_link со следующей ошибкой:

 Missing template votes/vote_up_user with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]}

Я могу понять, почему это не удается, поскольку у меня нет шаблона html.erb по указанному пути. Вместо этого у меня есть файл js.erb, так как это AJAX-вызов, но он не включен в массив: format и, следовательно, не найден. Мой вопрос заключается в том, какой наилучший способ обеспечить поиск в формате: js, когда интеграционный тест нажимает на ссылку? Это то, что я могу просто настроить в тесте, или мне нужно будет добавить его в помощник по ссылкам?

1 Ответ

4 голосов
/ 15 марта 2011

Я подозреваю, что причина не работает в том, что один RSpec не может тестировать Javascript.

Когда вы добавляете remote => true к ссылке, он добавляет только data-remote="true" в качестве атрибута ссылки, что ничего не значит без Javascript. Вот почему вы видите в своей ошибке :formats=>[:html]. Это только собирается искать представления HTML. Чтобы Rails по умолчанию запрашивал представление .js.erb, вам нужно иметь .js в конце запрашиваемого URL-адреса или использовать Javascript для запроса страницы.

Чтобы Javascript действительно работал в ваших тестах, вам нужно использовать что-то вроде Capybara. Когда вы запустите тест, вы фактически увидите, что ваш браузер запускается, и он фактически запустит ваш тест в браузере.

Если это то, что вы хотите сделать, я бы рекомендовал посмотреть недавний Railscast Райана Бейтса: http://railscasts.com/episodes/257-request-specs-and-capybara

Обновление на основе комментариев

respond_with будет перенаправлять только в местоположение, указанное вами в запросах POST, PUT или DELETE. Хотя у вас есть :method => :post в ссылке, ссылки всегда будут генерировать запросы GET, когда Javascript отключен (так как вы не используете AJAX). Без Javascript единственный способ создать запрос POST - с помощью тега формы.

Если вы хотите, чтобы он корректно ухудшался в этой ситуации, вы должны либо создать html-представление для этих ситуаций, либо поставить блок после respond_with следующим образом:

respond_with(@voted_on_user, :location => user_path(@voted_on_user)) do |format|
  format.html { redirect_to user_path(@voted_on_user) }
end`
...