Контроллеры сеансов RSpec - пользователь с недопустимыми параметрами без устройства - PullRequest
0 голосов
/ 11 декабря 2018

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

Я хотел запустить эти тесты для контроллера сессий, но второй (когда пользователь имеет недопустимые параметры) дает мнеошибка Expected response to be a <3XX: redirect>, but was a <200: OK> и я не понимаю почему с часов.

RSpec.describe SessionsController, type: :controller do
  let(:create_user) { @user = User.create(username: 'John', password: 'test123') }

  describe 'POST #create' do

    context 'when user is logged in' do
      it 'loads correct user details and redirect to the root path' do
        create_user
        post :create, params: { session: { username: @user.username, password: @user.password } }
        expect(response).to redirect_to(root_path)
      end
    end

    context 'when user has invalid params' do
      before do
        create_user
        post :create, params: { session: { username: @user.username, password: 'somepass' } }
      end

      it 'render new action' do
        expect(assigns(:user)).not_to eq create_user
        expect(response).to redirect_to(action: 'new')
      end
    end
  end
end

Sessions Controller

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
end

Я не совсем уверен, соответствует ли строка expect(assigns(:user)).not_to eq create_userсоглашение, но это не имеет значения для результата.

1 Ответ

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

В вашем тесте вы ожидаете ответа перенаправления:

expect(response).to redirect_to(action: 'new')

А в контроллере вы просто визуализируете new шаблон:

render 'new'

Я думаю, что это хороший подход к визуализации new, вы должны изменить свою спецификацию, чтобы ожидать этого.

expect(response).to render_template(:new)
...