在 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