0

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

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?

4

1 回答 1

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
于 2020-05-02T07:01:01.887 回答