在Rails5中使用rpec和factorygirl进行控制器测试



我试图使用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@example.com"和密码为"密码。"当我对这些变量调用put时,我可以看到它们设置正确。:

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中控制器的方式?返回此错误还有其他原因吗?

Rails 5对控制器测试中发送参数的方式进行了更改。

代替:

before :each do
  post :create, { session: { email: @user.email,
                             password: @user.password }}
end

您需要在请求后属性哈希中提供params密钥。就像这样…

before :each do
  post :create, params: { session: { email: @user.email,
                                     password: @user.password }}
end

这很微妙,但不同。如果可行,请告诉我。

最新更新