RSpec 会话控制器规范中 nil:NilClass 的未定义方法“[]”
RSpec undefined method `[]' for nil:NilClass in sessions controller spec
我有一个简单的消息应用程序可以学习 RSpec 其中一个用户可以创建消息给另一个用户(只有登录的用户才能写消息)。我没有使用设计来登录或注册用户,这个应用程序尽可能简单只是为了rspec学习。
我想测试会话控制器中的创建方法:
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 的未定义方法“[]”。它在应用程序中按预期工作。我错过了什么?我应该在 let(:user)
之后使用 session[:user_id]
吗?
Use let to define a memoized helper method. The value will be cached
across multiple calls in the same example but not across examples.
Note that let is lazy-evaluated: it is not evaluated until the first time the method it defines is invoked. You can use let! to
force the
- List item
method's invocation before each example.
xou can refer this to get further detailsrelish docs
可能性 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
我有一个简单的消息应用程序可以学习 RSpec 其中一个用户可以创建消息给另一个用户(只有登录的用户才能写消息)。我没有使用设计来登录或注册用户,这个应用程序尽可能简单只是为了rspec学习。
我想测试会话控制器中的创建方法:
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 的未定义方法“[]”。它在应用程序中按预期工作。我错过了什么?我应该在 let(:user)
之后使用 session[:user_id]
吗?
Use let to define a memoized helper method. The value will be cached across multiple calls in the same example but not across examples. Note that let is lazy-evaluated: it is not evaluated until the first time the method it defines is invoked. You can use let! to force the - List item
method's invocation before each example. xou can refer this to get further detailsrelish docs
可能性 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