2015-02-05 37 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

相关问题