【问题标题】:How do I unit test the current_user RoR如何对 current_user RoR 进行单元测试
【发布时间】:2020-05-02 02:18:28
【问题描述】:

我有这个方法来检查用户是否是管理员:

def admin?
  current_user.admin == true
end

单元测试是:

require 'rails_helper'

describe StubController do
  describe '.admin?' do
    it "should tell if the user is admin" do
      user = User.create!(email: "i@i.com", password:'123456', role: "admin", name: "Italo Fasanelli")

      result = user.admin?

      expect(result).to eq true
    end
  end
end

问题是,simplecov 告诉我这部分 current_user.admin == true 没有被覆盖。

如何在这个测试中测试 current_user?

【问题讨论】:

  • 你用过像Device这样的auth hems吗?
  • 是的,我正在使用 gem 设计
  • 您在哪里声明admin? 方法、模型或控制器?
  • 在应用程序控制器中。但是我做了这个 StubController,它只继承了 ApplicationController 的方法,我可以测试它的方法。

标签: ruby-on-rails rspec simplecov


【解决方案1】:

首先,将admin? 方法移至User 模型,以便在模型-视图-控制器之间重复使用。

class User < ApplicationRecord
  def admin?
    role == 'admin'
  end
end

您可以在可以访问User 实例的任何地方使用此方法。所以current_user.admin? 也可以跨视图和控制器工作。

现在您应该为模型而不是控制器编写测试。我还注意到您手动创建用户模型对象而不是使用工厂。使用FactoryBot 创建测试所需的实例。

这是一个快速规范,假设为用户设置了工厂

require 'rails_helper'

RSpec.describe User, type: :model do
  describe '.admin?' do
    context 'user has role set as admin' do
      let!(:user) { build(:user, role: 'admin') }

      it 'returns true' do
        expect(user).to be_admin
      end
    end

    context 'user has role set as non admin' do
      let!(:user) { build(:user, role: 'teacher') }

      it 'returns true' do
        expect(user).not_to be_admin
      end
    end
  end
end

【讨论】:

  • 非常感谢您的时间和解释,先生。我已经在使用 FactoryBot,但我完全忘了用它来更新测试。如果可以的话,我想问你更多关于这一行的信息 let!(:user) { build (:user, role: 'admin') } 这个语法属于 FactoryBot 吗?我从 web 开发开始,我只知道具有以下语法的 FactoryBot:create(:user, role: 'admin')
  • 在这里了解 buildcreate stackoverflow.com/questions/14098031/…
  • 现在知道了。非常感谢你。祝你有美好的一天!
猜你喜欢
  • 1970-01-01
  • 2012-01-08
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 2019-01-05
  • 2011-03-16
  • 2013-01-02
相关资源
最近更新 更多