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

时间:2016-08-01 17:16:47

标签: ruby-on-rails ruby rspec factory-bot

我正在尝试使用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发送到控制器的方式?是否还有其他原因要返回此错误?

1 个答案:

答案 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

这是微妙的,但它是不同的。如果有效,请告诉我。