1

我有一个正在开发的 Ruby on Rails 应用程序,但我的功能测试遇到了一些问题。特别是,当我通过具有类似凭据(相同角色等)的用户登录时,我在测试期间不断被拒绝访问可以在浏览器中访问的页面。例如,下面是控制器测试中的代码:

include Devise::TestHelpers
include Authorization::TestHelper
...
setup do
  @user = Factory(:user)
  @user.roles << Factory(:refinery_role)
  @user.roles << Factory(:agency_role)
  @user.save
  sign_in @user

  @agency = AgencyOrganization.create :name => "Test Agency"

  @adv1 = AdvertiserOrganization.create :name => "Test Advertiser", :parent => @agency

  UserOrganization.create :user_id => @user.id, :organization_id => @agency.id
end

test "agency user can edit advertiser" do
  assert @user.has_role? :agency #passes
  should_be_allowed_to :update, :advertiser_organizations #passes

  get :edit, {:id => @adv1.id}, {:agency_id => @agency.id}

  assert_equal "/unauthorized", request.env['PATH_INFO'] #passes :'(
  assert_template :edit #fails
  # and more tests we never get to
end

(显然,这些并不是我真正想要检查的所有断言,但它们证明了正在发生的事情。)

对于它的价值,上述测试失败并引发以下异常:

4) Failure:
test_agency_user_can_edit_advertiser(AdvertiserOrganizationsControllerTest [/Users/gworley/.rvm/gems/ruby-1.9.2-p180@portal/gems/declarative_authorization-0.5.1/lib/declarative_authorization/maintenance.rb:170]:
Exception raised:
<#<Authorization::NotAuthorized: No matching rules found for update for #<Authorization::GuestUser:0x00000101cda2b0 @role_symbols=[:guest]> (roles [:guest], privileges [:update, :manage], context :advertiser_organizations).>>.

同样,正如我所说,当您实际运行应用程序时,一切正常,它只是让测试工作(尽管也许应用程序只是偶然工作,谁知道呢?)。

4

4 回答 4

1

您在设置中缺少request.env["devise.mapping"] = Devise.mappings[:user]

查看 Devise wiki了解更多信息。我个人会将这个登录功能提取到一个单独的模块中,并根据要求包含它。即,login_user/login_agency_user

于 2011-07-12T20:40:13.647 回答
1

这是在黑暗中拍摄的,因为我没有在我的应用程序中使用 Devise,但是我们使用的身份验证系统具有这种特性,它只是:user_id在会话中设置,它在测试中被会话哈希破坏。

我注意到您的测试方法正在:agency_id会话中设置。

尝试完全删除会话哈希并查看您得到的错误是否被替换为关于缺少:agency_id而不是身份验证错误的错误,或者将 Devise 用于身份验证的任何会话变量添加到哈希中。

于 2011-07-19T05:51:43.673 回答
1

不要忘记设置 Authorization.current_user 否则 DA 将不知道谁登录

  def current_user
    @controller.current_user
  end
  def with_sign_in(u)
    sign_in u
    Authorization.current_user = current_user 
    yield
    sign_out u
    Authorization.current_user = nil
  end
于 2011-08-27T16:07:37.400 回答
0

身份验证(你是谁)还是授权(你可以做什么)失败了?如果授权失败,则可能是您使用的 declarative_authorization gem 有问题。如果是身份验证问题,那么很可能是 Devise gem 或 Devise TestHelpers 的问题。这个类似的问题可能会有所帮助。如果没有任何效果,那么也应该可以像这样取消身份验证

  before :each do
    @current_user = Factory(:user)
    controller.stub!(:current_user).and_return(@current_user)
    controller.stub!(:user_signed_in?).and_return(:true)
    controller.stub!(:authenticate_user!).and_return(:true)
  end
于 2011-07-19T13:48:53.417 回答