如何对 current_user RoR 进行单元测试
How do I unit test the current_user RoR
我有这个方法来检查用户是否是管理员:
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?
首先,将 admin?
方法移动到 User
模型,以便它可以在模型-视图-控制器中重复使用。
class User < ApplicationRecord
def admin?
role == 'admin'
end
end
只要可以访问 User
的实例,就可以使用此方法。所以 current_user.admin?
也可以跨视图和控制器工作。
现在你应该为模型而不是控制器编写测试。我还注意到您手动创建用户模型对象而不是使用 Factory。使用 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
我有这个方法来检查用户是否是管理员:
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?
首先,将 admin?
方法移动到 User
模型,以便它可以在模型-视图-控制器中重复使用。
class User < ApplicationRecord
def admin?
role == 'admin'
end
end
只要可以访问 User
的实例,就可以使用此方法。所以 current_user.admin?
也可以跨视图和控制器工作。
现在你应该为模型而不是控制器编写测试。我还注意到您手动创建用户模型对象而不是使用 Factory。使用 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