我正在使用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).>>.
击> <击> 撞击> 再说一次,正如我所说,当你实际运行应用程序时,一切正常,它只是让测试工作(虽然应用程序只是偶然工作,谁知道?)。
答案 0 :(得分:1)
您在设置request.env["devise.mapping"] = Devise.mappings[:user]
有关详细信息,请查看Devise wiki。就个人而言,我会将此登录功能提取到一个单独的模块中,并根据请求包含它。即,login_user
/ login_agency_user
答案 1 :(得分:1)
这是一个黑暗中的镜头,因为我没有在我的应用程序中使用Devise,但我们使用的身份验证系统具有这种特性,它只是在会话中设置:user_id
,这会受到测试中的会话哈希。
我注意到您的测试方法是在会话中设置:agency_id
。
尝试完全删除会话哈希并查看您获得的错误是否被替换为缺少:agency_id
而不是身份验证错误,或者将Devise用于身份验证的任何会话变量添加到哈希。
答案 2 :(得分: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
答案 3 :(得分:0)
身份验证(您是谁)或授权(您允许做什么)失败了?如果授权失败,那么您使用的declarative_authorization gem可能存在问题。如果是身份验证问题,则可能是Devise gem或Devise TestHelpers的问题。这similar question可能会有所帮助。如果没有任何作用,那么也应该可以像这样删除身份验证
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