2014-09-26 63 views
0

我正在使用Rails4和設計。在編寫控制器規格時,我遇到了這樣的代碼:有人能解釋一下這個RSpec存根是如何工作的嗎?

user = double(@user) 
request.env['warden'].stub :authenticate! => user 
allow(controller).to receive(:current_user) { user } 

... here

它的工作原理。我寫的控制器規範要求認證通過適當。

我讀過一些關於存根工作原理的web條目,我想我明白了。似乎快速和足夠我的需求。

即使上面的代碼使用RSpec的double方法,我仍然得到這個折舊警告:

從RSpec的,嘲笑的老:should語法使用stub沒有明確 使語法已過時。改爲使用新的:expect語法或 明確啓用:should。從 調用/Users/perry_mac/rails_projects/mymri/spec/controllers/steps_controller_spec.rb:14:in `block(2 levels)in'。

由於我使用「new:expect語法」,這使我感到困惑。所以我對這個其他工作的代碼片斷感到不知所措。例如,我現在還不清楚如何使用它來編寫一個測試,該測試使用兩個用戶登錄並確保每個用戶都只能看到他們的適當範圍的搜索結果。是否有更合適的方式來存根會話來檢查使用身份驗證的控制器?

而且......爲什麼上面的工作,但這樣的事情不?:

before(:each) { 
email = "[email protected]" 
password= "password" 
@user = FactoryGirl.create(:user, email: email, password: password) 

session[:user_id] = @user.id 
. 
. 
. 

回答

0

顯然,所有我需要的是:

@request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in @user 

根據this它說:

有兩件事情需要牢記:

1)這些助手不會爲由Capybara或Webrat驅動的集成測試工作。它們只能用於功能測試。相反,填寫表格或明確地設置用戶在會話中; 2)如果您正在測試Devise內部控制器或從Devise's繼承的控制器,則需要告訴Devise在請求之前應使用哪個映射。這是必要的,因爲Devise從路由器獲取此信息,但由於功能測試不通過路由器,因此需要明確告知。例如,如果您正在測試用戶範圍,只需執行以下操作:

@request.env["devise.mapping"] = Devise.mappings[:user] 
get :new 
相關問題