【问题标题】:Controller testing with rpec and factorygirl in Rails 5在 Rails 5 中使用 rpec 和 factorygirl 进行控制器测试
【发布时间】: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=&gt;{:email=&gt;"example@user.com", :password=&gt;"password"}},这只会让我更加困惑。似乎一切都分配给了我?
  • 你错了。在您致电 post :create, ... 后,我要求您检查控制器操作中的参数
  • 看起来 params[:session] 正在返回这个字符串 example@user.com password 我不知道为什么它不会返回一个哈希值,但是因为我将它定义为一个哈希值。

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


【解决方案1】:

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

代替:

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

您需要在 post 请求属性哈希中提供 params 键。就这样……

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

这是微妙的,但它是不同的。让我知道这是否有效。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多