10

考慮下面的集成測試:如何從Rails集成測試訪問會話?

test "if there is no user in session, redirect to index and flash message" do 
    open_session do |sess| 
    post '/login', :email => users(:client).email, :password => 'rumpelstiltskin' 
    sess[:user] = nil 
    get '/user_page' 
    assert_redirected_to index_path 
    assert_equal "Your session has expired. Please log in again", flash[:notice] 
    end  
end 

這會產生錯誤:​​

而且,更改爲sess.session[:user] = nil產生一個錯誤,以及:NoMethodError: undefined method 'session' for nil:NilClass

如何從一個整合修改會話PARAMS在Rails中測試?

工作在Rails 3.0.7,Ruby 1.9.2p180,單元測試框架。

編輯:
get '/user_page', nil, {:user => nil}get ('/user_page', nil, {:user => nil})生成錯誤。

+0

這是單元測試還是集成測試? :) – Rimian

回答

2

只需使用session[:user]沒有open_session

+1

'session [:user] = nil'不會將更新的會話傳遞給控制器​​。 –

+0

這適用於導軌2,但不適用導軌3(這是問題中使用的版本)。 –

+0

對我來說很適合用minitest和導軌3.1 – NARKOZ

2

事實證明,它似乎並不可能做到這一點。

+0

@NARKOZ的回答在導軌上工作得很好3 – pahnin

3

在Rails 3.2.3以下似乎爲我工作:

# Hit the root_path to start our session 
get root_path 

# A helper method to set our session 
login_as(@user_fixture) 

# Now we can access the session variable 
assert session[:user_id] 

不知道這是否會爲你工作,讓好運!

-1

這不是集成測試的設計目的。你不應該直接修改會話,而應該打你的/註銷路徑。

+2

是的,但問題是關於訪問'session'。 –

+0

@BorisStitnicky - 是的,我說不訪問會話,它是錯誤的。我在2年前寫了這篇文章,但我認爲我仍然支持它。 – superluminary

相關問題