我正在尝试使用rspec在我的Rails 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创建一个用户,其电子邮件为“user@example.com”,密码为“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
我是否误解了在rspec中将params发送到控制器的方式?是否还有其他原因要返回此错误?
答案 0 :(得分:0)
在Rails 5中对您在控制器测试中发送params的方式进行了更改。
而不是:
before :each do
post :create, { session: { email: @user.email,
password: @user.password }}
end
您需要在post request属性hash中提供params
密钥。像这样......
before :each do
post :create, params: { session: { email: @user.email,
password: @user.password }}
end
这是微妙的,但它是不同的。如果有效,请告诉我。