2011-07-25 46 views
9

這是Cookies集合在以下環境中的控制器規範的問題:Cookies不會在Rspec的堅持在鐵軌3.1

  • 軌3.1.0.rc4
  • rspec的2.6.0
  • RSpec的護欄2.6.1

我有創建廠用戶,調用方法的牌子,上面設置了一個cookie,然後測試以查看是否在用戶的簽署可以訪問一個頁面一個簡單的控制器規範。問題在於所有的cookie似乎在設置的身份驗證cookie和我的控制器上調用的「show」操作之間消失。

我的代碼在rails dev服務器上的瀏覽器中運行時工作正常。運行規範時的奇怪行爲是,儘管cookie散列設置的所有內容都會消失,但通過會話散列設置的所有內容都會一直存在。我在使用rspec時只是錯過了關於cookies的工作方式?

規格代碼

it "should be successful" do 
    @user = Factory(:user) 
    test_sign_in @user 
    get :show, :id => @user 
    response.should be_success 
end 

登錄代碼

def sign_in(user, opts = {}) 
    if opts[:remember] == true 
    cookies.permanent[:auth_token] = user.auth_token 
    else 
    cookies[:auth_token] = user.auth_token 
    end 
    session[:foo] = "bar" 
    cookies["blah"] = "asdf" 
    self.current_user = user 
    #there are two items in the cookies collection and one in the session now 
end 

的get認證檢查:顯示要求的在這裏失敗了,因爲餅乾[:AUTH_TOKEN]是零

def current_user 
#cookies collection is now empty but session collection still contains :foo = "bar"... why? 
@current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token] 
end 

這是一個錯誤?這是我不明白的某種意圖行爲嗎?我只是在尋找明顯的東西嗎?

+0

我得到了同樣的問題 - 我已經嘗試了很多排列和亂翻並且我無法正常工作 –

回答

3

出現同樣的問題。嘗試從您的測試中使用@request.cookie_jar

+1

這可以起作用,但從我的測試代碼中設置Cookie似乎並不正確,因爲這樣做會是多餘的(代碼中的登錄已經這樣做),並且可能會導致測試通過儘管我登錄代碼中存在錯誤。 – Fignuts

7

這是我如何解決了這個:

def sign_in(user) 
cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
current_user = user 
@current_user = user 
end 

def sign_out 
current_user = nil 
@current_user = nil 
cookies.delete(:remember_token) 
end 

def signed_in? 
return !current_user.nil? 
end 

出於某種原因,你必須設置兩個@current_user和CURRENT_USER爲它在Rspec的工作。我不知道爲什麼,但它使我完全瘋狂,因爲它在瀏覽器中工作正常。

+1

神聖莫里!這對我有效。我正在將Michael Hartl的教程(railstutorial.org)升級到Rails 3.1.3,並遇到同樣的問題,這完全奏效。謝謝@mike。 –

+0

沒問題,我從相同的教程得到:) @MichaelKMadison – mike

+0

謝謝@mike!在這裏呆了很長一段時間後,這種方法很有效。但爲什麼都需要? – freethinker

2

上述額外的行是沒有必要的。我發現只需調用self.current_user = user setter方法就可以自動更新實例變量。由於某種原因,在沒有自我的情況下調用它不會調用setter方法。

這裏是我的代碼,而無需額外的線路:

def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
end 

def sign_out 
    cookies.delete(:remember_token) 
    self.current_user = nil 
end 

def current_user=(user) 
    @current_user = user 
end 

我仍然不知道爲什麼,也許一個RSpec錯誤

+0

這個和mike的答案都可以工作,但是這樣稍微優雅 – prusswan

+2

如果你不使用'self'。那麼current_user =是一個局部變量賦值,而不是current_user = –

+0

的方法調用,用於更優雅的解決方案 –