在 Rails 控制器中测试 JS 操作,响应始终为空
Testing JS actions in a Rails controller, the response is always empty
有意见:
# views/users/index.html.erb
<%= link_to 'Destroy', user_destroy_path(user), remote: :true %>
进行销毁操作:
# controllers/users_controller.rb
respond_to :js
def destroy
@user = user.find(params.require(:id))
@user.destroy
end
呈现:
# views/users/destroy.js.erb
$('#some_div').html('Bye Bye' + user.name);
我想为它编写控制器测试测试
# spec/controllers/users_controller_spec.rb
describe UsersController do
it 'says goodbye' do
delete :destroy, id: user
expect(response.body).to include('Bye Bye #{user.name}')
end
end
但 "response.body" 始终为空字符串。为什么?如何查看js响应内容?
您需要告诉 Rspec 渲染视图。默认情况下没有。
require "spec_helper"
describe UsersController, type: :controller do
render_views
it 'says goodbye' do
delete :destroy, id: user
expect(response.body).to include("Bye Bye #{user.name}")
end
end
但是,鉴于您依赖 JavaScript,您将无法找到文本,因为这只会 return HTML.
为了使其正常工作,您需要使用实际的浏览器,因此这意味着使用 PhantomJS 之类的功能规范(请参阅 poltergeist gem for capybara), or moving to Cucumber。
然后您的测试将从用户的角度断言某些事情,如下所示:
it 'says goodbye', js: true do
visit home_page
click_button 'Log out'
expect(page).to have_content("Bye Bye #{user.name}")
end
有意见:
# views/users/index.html.erb
<%= link_to 'Destroy', user_destroy_path(user), remote: :true %>
进行销毁操作:
# controllers/users_controller.rb
respond_to :js
def destroy
@user = user.find(params.require(:id))
@user.destroy
end
呈现:
# views/users/destroy.js.erb
$('#some_div').html('Bye Bye' + user.name);
我想为它编写控制器测试测试
# spec/controllers/users_controller_spec.rb
describe UsersController do
it 'says goodbye' do
delete :destroy, id: user
expect(response.body).to include('Bye Bye #{user.name}')
end
end
但 "response.body" 始终为空字符串。为什么?如何查看js响应内容?
您需要告诉 Rspec 渲染视图。默认情况下没有。
require "spec_helper"
describe UsersController, type: :controller do
render_views
it 'says goodbye' do
delete :destroy, id: user
expect(response.body).to include("Bye Bye #{user.name}")
end
end
但是,鉴于您依赖 JavaScript,您将无法找到文本,因为这只会 return HTML.
为了使其正常工作,您需要使用实际的浏览器,因此这意味着使用 PhantomJS 之类的功能规范(请参阅 poltergeist gem for capybara), or moving to Cucumber。
然后您的测试将从用户的角度断言某些事情,如下所示:
it 'says goodbye', js: true do
visit home_page
click_button 'Log out'
expect(page).to have_content("Bye Bye #{user.name}")
end