在Rails控制器中测试JS操作,响应始终为空

时间:2015-12-10 12:10:05

标签: ruby-on-rails ruby ruby-on-rails-4 rspec ujs

有意见:

# 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

但&#34; response.body&#34;总是空字符串。为什么?如何检查js响应的内容?

1 个答案:

答案 0 :(得分:3)

您需要告诉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之类的功能规范(请参阅poltergeist gem for capybara)或移至Cucumber。< / p>

然后,您的测试将从用户的角度断言,如下所示:

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