RSpec неопределенный метод `[] 'для nil: NilClass в спецификации контроллера сессий - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть простое приложение для сообщений, чтобы узнать RSpec, где один пользователь может создавать сообщения другому пользователю (только зарегистрированные пользователи могут писать сообщения).Я не использовал devise для входа или регистрации пользователей, это приложение настолько простое, насколько это возможно, только для обучения rspec.

Я хочу протестировать метод create в контроллере сессий:

class SessionsController < ApplicationController
  before_action :logged_in_redirect, only: %i[new create]

  def new; end

  def create
    user = User.find_by(username: params[:session][:username])
    if user && user.authenticate(params[:session][:password])
      session[:user_id] = user.id
      flash[:success] = 'You have successfully logged in'
      redirect_to root_path
    else
      flash.now[:error] = 'There was something wrong with your login'
      render 'new'
    end
  end

  def logged_in_redirect
    if logged_in?
      flash[:error] = 'You are already logged in'
      redirect_to root_path
    end
  end

Это соответствующий код из моей спецификации контроллера сессий:

RSpec.describe SessionsController, type: :controller do
  describe 'POST #create' do
    context 'when password is correct' do
      let(:user) { User.create(username: 'John', password: 'test123') }
      it 'redirect to root path' do
        post :create, session: { username: 'John', password: 'test123' }

        expect(response).to have_http_status(:redirect)
      end
    end
  end
end

Ошибка говорит о неопределенном методе `[] 'для nil: NilClass.Работает как положено в приложении.Что мне не хватает?Должен ли я использовать session[:user_id] после let(:user)?

1 Ответ

0 голосов
/ 08 декабря 2018

Используйте let, чтобы определить запомненный вспомогательный метод.Значение будет кэшировано для нескольких вызовов в одном и том же примере, но не во всех.Обратите внимание, что let вычисляется лениво: он не вычисляется до тех пор, пока в первый раз не будет вызван метод, который он определяет.Вы можете использовать пусть!принудительно вызывать метод - List item

перед каждым примером.Вы можете сослаться на это, чтобы получить более подробную информацию см. документы

Возможность 1

RSpec.describe SessionsController, type: :controller do

      describe 'POST #create' do

        before :each do
         @user = User.create(username: 'John', password: 'test123') 
        end

        context 'when password is correct' do

          it 'redirect to root path' do
            post :create, params: {session: { username: @user.username, password: @user.password }}

            expect(response).to have_http_status(:redirect)
          end
        end
      end
    end

Возможность 2

RSpec.describe SessionsController, type: :controller do

        let(:create_user) do 
          @user = User.create(username: 'John', password: 'test123') 
        end

      describe 'POST #create' do
        context 'when password is correct' do

          it 'redirect to root path' do
            create_user

            post :create, params: {session: { username: @user.username, password: @user.password }}

            expect(response).to have_http_status(:redirect)
          end
        end
      end
    end
...