2016-08-01 2 views
1

내 레일에 RSpec에를 사용하여 5 응용 프로그램을 일부 컨트롤러 사양을 만들려고 해요,하지만 코드는 다음과 같은 오류를 던지고 유지는 :컨트롤러 테스트는 5

1) SessionsController Log in and log out logs in with valid user 
    Failure/Error: user = User.find_by(email: params[:session][:email].downcase) 

    NoMethodError: 
    undefined method `[]' for nil:NilClass 

내 스펙은 매우 간단합니다 . 사용자 인스턴스 변수는 factory-girl을 사용하여 전자 메일 "[email protected]"과 암호가 "password"인 사용자를 만듭니다. 나는 이러한 변수에 박았를 호출 할 때, 나는 그들이 올바르게 설정 마지막으로

require 'rails_helper' 

RSpec.describe SessionsController, type: :controller do 
    before :each do 
    @user = create(:user) 
    end 

    describe "Log in and log out" do 
    before :each do 
     post :create, { session: { email: @user.email, 
            password: @user.password }} 
    end 
    it "logs in with valid user" do 
     puts @user.email + " " + @user.password 
     expect(is_logged_in?).to be_truthy 
    end 
    end 
end 

.:되는 것을 볼 수 있습니다, 세션 제어 장치의 코드는 다음과 같습니다 : 방식 PARAMS은

class SessionsController < ApplicationController 
    def new 
    end 

    def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    if user && user.authenticate(params[:session][:password]) 
     log_in user 
     remember user 
     redirect_to user 
    else 
     flash.now[:danger] = 'Invalid email/password combination' 
     render 'new' 
    end 
    end 
end 

내가 오해하고 있는가이다 rspec에서 컨트롤러로 보냈습니까? 이 오류가 반환되는 다른 이유가 있습니까?

+0

'puts @ user.email + ""+ @ user.password'를 확인하는 대신 컨트롤러 동작에서'params [: session]'을 확인해야합니다. 그것은 오류 메시지에 따라'nil '입니다. –

+0

고마워, 나는 params를 일렬로 먼저 선언하고 post 문 앞에 puts params를 호출하여이를 시도했다. Parms는'{: session => {: email => "[email protected]", : password => "password"}}를 사용하고 있습니다. 모든 것이 나에게 할당 된 것처럼 보입니다. –

+0

잘못 들었습니다. 나는 당신이'post : create, ... '를 호출 한 후 컨트롤러 액션에서 params를 확인해달라고 요청했다. –

답변

0

컨트롤러 테스트에서 매개 변수를 전송하는 방식이 레일 5에서 변경되었습니다.

대신에 :

before :each do 
    post :create, { session: { email: @user.email, 
          password: @user.password }} 
end 

당신은 POST 요청 속성 해시에서 params 키를 제공해야합니다. 그렇게 ...

before :each do 
    post :create, params: { session: { email: @user.email, 
            password: @user.password }} 
end 

그것은 미묘합니다. 그게 작동하는지 알려주세요.

+0

더 자세한 정보는 https://github.com/thoughtbot/shoulda-matchers/issues/867 입니다. 그러나이 경우 실제 세션과 SessionController 매개 변수를 혼동하지 마십시오. – jamesmarkcook