#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