Ruby on rails 在Rails控制器中测试JS操作时,响应总是空的

Ruby on rails 在Rails控制器中测试JS操作时,响应总是空的,ruby-on-rails,ruby,ruby-on-rails-4,rspec,ujs,Ruby On Rails,Ruby,Ruby On Rails 4,Rspec,Ujs,有观点: # views/users/index.html.erb <%= link_to 'Destroy', user_destroy_path(user), remote: :true %> 这使得: # views/users/destroy.js.erb $('#some_div').html('Bye Bye' + user.name); 我想为它编写控制器测试 # spec/controllers/users_controller_spec.rb describe

有观点:

# views/users/index.html.erb
<%= link_to 'Destroy', user_destroy_path(user), remote: :true %>
这使得:

# 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,您将无法找到文本,因为这将返回HTML

为了实现这一点,您需要使用实际的浏览器,因此这意味着使用PhantomJS之类的特性规范(请参阅适用于capybara的),或者移动到

然后,您的测试将从用户的角度断言一些事情,比如:

it 'says goodbye', js: true do
  visit home_page
  click_button 'Log out'
  expect(page).to have_content("Bye Bye #{user.name}")
end

如果它不是默认添加的,也许我不应该在控制器规格中使用它?也许我应该将这些规范转移到capybara测试中,在控制器测试中只需确保状态为:ok或:bad_requests,但实际上
render_views
处理js.erb文件中所有嵌入的ruby,所以我不需要使用capybara/poltergeist来通过此测试:)
it 'says goodbye', js: true do
  visit home_page
  click_button 'Log out'
  expect(page).to have_content("Bye Bye #{user.name}")
end