专家 rspec - 未初始化的常量 UserPolicy,为什么?
pundit rspec - uninitialized constant UserPolicy, why?
寻求一些帮助,我是 Rspec 和专家的菜鸟,我正在按照一个示例来设置专家并对其进行测试,但是所有测试都失败了
NameError:
uninitialized constant UserPolicy
# ./spec/policies/user_policy_spec.rb:1:in `<top (required)>'
No examples found.
需要一些帮助来弄清楚原因,因为我不知道:(
使用:
- Rails 5.1.6
- RSpec 3.7
- rspec-核心 3.7.1
- rspec-期望值 3.7.0
- rspec-模拟 3.7.0
- rspec-rails 3.7.2
- rspec-支持3.7.1
- 专家 1.1.0
- 设计 4.4.3
config/initializers/pundit.rb
module PunditHelper
extend ActiveSupport::Concern
included do
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
end
private
def user_not_authorized
flash[:alert] = "Access denied."
redirect_to (request.referrer || root_path)
end
end
ApplicationController.send :include, PunditHelper
app/policies/user_policy.rb
class UserPolicy
include ApplicationHelper
attr_reader :current_user, :model
def initialize(current_user, model)
@current_user = current_user
@user = model
end
def index?
is_admin?(@current_user)
end
def show?
is_admin?(@current_user) or @current_user == @user
end
def update?
is_admin?(@current_user) or @current_user == @user
end
def destroy?
is_admin?(@current_user) or @current_user == @user
end
end
spec/support/pundit.rb
require 'pundit/rspec'
spec/rails_helper.rb
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if
Rails.env.production?
require 'rspec/rails'
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
...
spec/policies/user_policy_spec.rb
describe UserPolicy do
subject { UserPolicy }
let (:current_user) { FactoryBot.build_stubbed :user }
let (:other_user) { FactoryBot.build_stubbed :user }
let (:admin) { FactoryBot.build_stubbed :user, :admin }
permissions :index? do
it "denies access if not an admin" do
expect(user_policy).not_to permit(current_user)
end
it "allows access for an admin" do
expect(user_policy).to permit(admin)
end
end
end
app/controllers/users_controller.rb
class UsersController < ApplicationController
include Pundit
before_action :authenticate_user!
after_action :verify_authorized
def index
@users = User.all
authorize User
end
....
end
您的 user_policy_spec 文件
中缺少 'rails_helper' 的要求行
require 'rails_helper'
寻求一些帮助,我是 Rspec 和专家的菜鸟,我正在按照一个示例来设置专家并对其进行测试,但是所有测试都失败了
NameError:
uninitialized constant UserPolicy
# ./spec/policies/user_policy_spec.rb:1:in `<top (required)>'
No examples found.
需要一些帮助来弄清楚原因,因为我不知道:(
使用:
- Rails 5.1.6
- RSpec 3.7
- rspec-核心 3.7.1
- rspec-期望值 3.7.0
- rspec-模拟 3.7.0
- rspec-rails 3.7.2
- rspec-支持3.7.1
- 专家 1.1.0
- 设计 4.4.3
config/initializers/pundit.rb
module PunditHelper
extend ActiveSupport::Concern
included do
include Pundit
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
end
private
def user_not_authorized
flash[:alert] = "Access denied."
redirect_to (request.referrer || root_path)
end
end
ApplicationController.send :include, PunditHelper
app/policies/user_policy.rb
class UserPolicy
include ApplicationHelper
attr_reader :current_user, :model
def initialize(current_user, model)
@current_user = current_user
@user = model
end
def index?
is_admin?(@current_user)
end
def show?
is_admin?(@current_user) or @current_user == @user
end
def update?
is_admin?(@current_user) or @current_user == @user
end
def destroy?
is_admin?(@current_user) or @current_user == @user
end
end
spec/support/pundit.rb
require 'pundit/rspec'
spec/rails_helper.rb
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if
Rails.env.production?
require 'rspec/rails'
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
...
spec/policies/user_policy_spec.rb
describe UserPolicy do
subject { UserPolicy }
let (:current_user) { FactoryBot.build_stubbed :user }
let (:other_user) { FactoryBot.build_stubbed :user }
let (:admin) { FactoryBot.build_stubbed :user, :admin }
permissions :index? do
it "denies access if not an admin" do
expect(user_policy).not_to permit(current_user)
end
it "allows access for an admin" do
expect(user_policy).to permit(admin)
end
end
end
app/controllers/users_controller.rb
class UsersController < ApplicationController
include Pundit
before_action :authenticate_user!
after_action :verify_authorized
def index
@users = User.all
authorize User
end
....
end
您的 user_policy_spec 文件
中缺少 'rails_helper' 的要求行require 'rails_helper'