2016-08-01 47 views
1

我試圖在我的Rails創建一些控制器的規格使用RSpec的5應用程序,但該代碼不斷拋出以下錯誤:在Rails的RPEC和factorygirl控制器測試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 

最後,從會話控制器的代碼如下:

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 

我誤解PARAMS的方式是發送到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,...之後要求你在控制器動作中檢查參數' –

回答

0

Rails 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 params。 – jamesmarkcook

相關問題