【发布时间】:2016-12-07 01:43:41
【问题描述】:
我正在尝试使用 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
我的规范非常简单。 user 实例变量使用 factory-girl 创建一个用户,其电子邮件地址为“user@example.com”,密码为“password”。当我对这些变量调用 puts 时,我可以看到它们设置正确。:
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[:session],而不是检查puts @user.email + " " + @user.password。根据错误消息,这是nil。 -
谢谢,我尝试通过在前面声明 params 一行并在 post 语句之前调用 puts params。 Parms 正在输入
{:session=>{:email=>"example@user.com", :password=>"password"}},这只会让我更加困惑。似乎一切都分配给了我? -
你错了。在您致电
post :create, ...后,我要求您检查控制器操作中的参数 -
看起来 params[:session] 正在返回这个字符串
example@user.com password我不知道为什么它不会返回一个哈希值,但是因为我将它定义为一个哈希值。
标签: ruby-on-rails ruby rspec factory-bot