gpt4 book ai didi

ruby-on-rails - 在测试 Controller 时保持 DRY,通过 CanCan 授权

转载 作者:行者123 更新时间:2023-11-28 20:17:41 25 4
gpt4 key购买 nike

我正在使用 RSpec 为 Rails 项目追溯编写一些测试。

我正在使用 CanCan gem 来提供授权。我决定编写一个规范来测试 ability.rb 模型。然后我继续测试我剩下的模型。

我转向了 Controller ,但遇到了一个巨大的障碍:我正在重新测试我的能力!

基本上,我必须剔除一系列模型,并剔除它们之间的关联;否则响应只会返回 403 Forbidden
这样做的原因是 Controller 基本上负责担心授权。

我不太确定从这里到哪里去。我最多 stub 6 个模型,只是为了编写一个测试。我知道能力是有效的,这就是 ability_spec.rb 的用途。

所以这个问题实际上有两个问题:

  1. 我应该单独测试能力模型吗?
  2. Controller 测试是否应该关注适当的权限?

编辑 需要'spec_helper' include Devise::TestHelpers # 让你的规范访问助手

describe TokensController do
before(:each) do
@mock_user = User.new(:username => "bob", :email => "user@user.com", :password => "longpassword")
@mock_user.role = "admin"
sign_in @mock_user
#Ability.stub!('can').and_return(true)
end
it "should let me see grids/:g_id/tokens index" do
test_grid = mock_model(Grid)
test_token = mock_model(Token)
Grid.stub!(:find).and_return(test_grid)
Token.stub!(:find).and_return(test_token)
get 'index'

a1 = Ability.new(@mock_user)
a1.can?(:index, Token).should be_true # This line works fine; as it should
puts response.status #This returns 403, which means CanCan::AccessDenied was raised
end
end

谢谢,
罗比

最佳答案

不确定这对你来说是否为时已晚,但我遇到了同样的问题,并使用以下代码示例解决了它 --

before do
@user = Factory.create(:user)
sign_in @user

@abilities = Ability.new(@user)
Ability.stub(:new).and_return(@abilities)
end
end

我已经删除了 Ability#new,给我一个控制当前用户的 Ability 实例的引用。然后,我可以像这样去掉特定的能力:

@abilities.stub!(:can?).with(:destroy, regatta).and_return(true)

或授予管理员权限:

@abilities.stub!(:can?).and_return(false)

关于ruby-on-rails - 在测试 Controller 时保持 DRY,通过 CanCan 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com