rspec тестирует ajax-ответ (должен отображать частичный)

#ruby-on-rails #ruby #rspec

#ruby-on-rails #ruby #rspec

Вопрос:

Я хочу проверить, что мое действие контроллера отображает частичный.

Я покопался и, похоже, не могу найти ничего, что работает.

создать действие:

 def create
  @project = Project.new...
  respond_to do |format|
    if @project.save
      format.js { render :partial => "projects/form" }
    end
  end
end
  

спецификация:

 it "should save and render partial" do
  ....
  #I expected/hoped this would work
  response.should render_partial("projects/form")
  #or even hopefully
  response.should render_template("projects/form")
  #no dice
end
  

Ответ №1:

Если вы ищете РЕАЛЬНЫЙ ответ … (т. Е. полностью в RSpec, а не с использованием Capybara), в документации RSpec говорится, что render_template является оболочкой для assert_template . assert_template (согласно документам) также указывает, что вы можете проверить, что часть была отображена, включив ключ :partial.

Попробуйте…

 it { should render_template(:partial => '_partialname') }
  

Комментарии:

1. @BlueFish, я думаю, твой ответ правильный, но похоже, что его response_to выполняет ответ в js. Это поможет или нам нужно добавить что-нибудь дополнительное? У меня была похожая трудность.

2. Работает слишком хорошо для меня. render_template, похоже, передает все, что я ввел (пытаясь протестировать поведение контроллера по умолчанию)

Ответ №2:

Обновление смотрите ответ bluefish ниже, похоже, это правильный ответ

Не могли бы вы рассмотреть возможность использования Capybara для вашего интеграционного тестирования? Я обнаружил, что ajax сложно тестировать только с помощью rspec. В вашем случае я даже не уверен, что вы уже получаете ответ. В capybara он ожидает завершения вызова ajax, и вы можете вызвать page.has_xxxx, чтобы узнать, был ли он обновлен. Вот пример:

 it "should flash a successful message" do
    visit edit_gallery_path(@gallery)
    fill_in "gallery_name", :with => "testvalue"
    click_button("Update")
    page.has_selector?("div#flash", :text => "Gallery updated.")
    page.has_content?("Gallery updated")
    click_link "Sign out"
end
  

Ответ №3:

еще один отличный способ протестировать ваш метод контроллера ajax — это проверить назначения, которые позже используются для отображения результата. Вот небольшой пример:

Контроллер

 def do_something
  @awesome_result = Awesomeness.generete(params)
end
  

JBuilder

 json.(@awesome_result, :foo, :bar)
  

Тест контроллера Rspec

 describe :do_something do

  before do
    @valid_params{"foo" => "bar"}
  end

  it "should assign awesome result" do
    xhr :post, :do_something, @valid_params
    assigns['awesome_result'].should_not be_nil
  end

end