2015-02-05 35 views
0

我正在編寫一個Rails 4應用程序來學習Rails &測試。我的程序代碼按預期工作,但我無法弄清楚爲什麼在發佈到Sessions控制器測試(RSpec v.3.1.0)中的create方法時發現無方法錯誤。以下是錯誤的文本:發佈到創建方法會導致錯誤Sessions控制器測試(RSpec)

Failure/Error: post :create, email: "[email protected]", password: "passwordx" 
NoMethodError: 
    undefined method `[]' for nil:NilClass 

這是相關的代碼從我的會話控制器規格:

describe "POST create" do 
context "with correct credentials" do 

let!(:user) { User.create(user_name: "Testerx", email: "[email protected]", password: "passwordx", password_confirmation: "passwordx", workout_enthusiast: "true") } 

it "redirects to user show page" do   
    post :create, email: "[email protected]", password: "passwordx" 
    expect(response).to be_redirect 
    expect(response).to redirect_to(users_show_path) 
end 

這是我的會話控制器代碼:

class SessionsController < ApplicationController 
def new 
end 

def create 
user = User.find_by(email: params[:session][:email].downcase) 
if user && user.authenticate(params[:session][:password]) 
    # Logs the user in and redirects to the user's show page. 
    log_in user 
    params[:session][:remember_me] == '1' ? remember(user) : forget(user)  
    redirect_to user 
else  
    flash.now[:danger] = 'Invalid email/password combination' 
    render 'new' 
end 
end 

def destroy 
log_out if logged_in?  
redirect_to root_url 
end 
end 

錯誤說,對無未定義的方法:NilClass。我確定用戶是有效的。我無法弄清楚爲什麼發佈到創建方法不在測試場景中工作。它在應用程序中按預期工作。我錯過了什麼?

回答

2

變化post :create, email: "[email protected]", password: "passwordx"變爲post :create, session: { email: "[email protected]", password: "passwordx" }

post的第二個參數是一個參數散列,它將被髮送到控制器。你現在通過{ email: "[email protected]", password: "passwordx" }post,顯然在參數散列中沒有session鍵。當您的控制器嘗試訪問paramas[:session][:xxx]時,它會得到NoM​​ethodError,因爲params[:session]爲零,而零沒有方法[]

+0

謝謝!設置會話密鑰將會話控制器測試從「紅色」更改爲「綠色」。我也非常感謝你的優秀解釋。這有助於我學習。我會記得下次設置會話密鑰! – codeinspired

相關問題