2015-12-10 46 views
1

有一個觀點:在Rails控制器測試JS的行動,響應總是空

# 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響應的內容?

回答

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爲水豚),或移動到Cucumber功能規格。

你的測試將隨後但從用戶的角度斷言的事情,這樣的事情:

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

如果不是默認添加也許我不應該在控制器的規格使用呢?也許我應該將這些規格移到水豚測試中,並在控制器測試中確保狀態爲:ok或:bad_request –

+0

是的,這不是真正的控制器。請參閱編輯。 –

+0

但實際上'render_views'處理js.erb文件中的所有嵌入的紅寶石,所以我不需要使用水豚/ poltergeist來使這個測試通過:) –