Я пытаюсь написать несколько тестов на огурец, чтобы убедиться, что разрешения cancan установлены правильно, и у меня возникла странная проблема:
Когда я вхожу через следующий код, capybara говорит, что явошел как ожидалось.Тем не менее, когда я захожу на ресурс, которому требуется данный логин, я получаю сообщение CanCan «не авторизовано».Capybara распечатывает «зарегистрированный как testsuperadmin с ролью superadmin» (нужную роль) на той же самой странице «запрещенный доступ».
Доступ к той же странице вручную, а не через огурец / капибару, авторизация предоставляетсяработает отлично.Аутентификация обрабатывается devise.
Я пытался добавить @ allow-rescue над сценарием и ActionController :: Base.allow_rescue = true к features / support / env.rb - ни один из них не дал никакого эффекта.
Есть предложения?Этот действительно поставил меня в тупик.
Ура ...
#app/models/ability.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role? :superadmin
can :manage, :all
elsif user.role? :admin
can :manage, [Broker, User]
elsif user.role? :staff
can :manage, Broker
elsif user.role? :broker
can :manage, Broker, :user_id => user.id
can :read, Broker
elsif user.role? :customer
can :manage, User, :id => user.id
else can :read, [Broker]
end
end
end
# features/brokers.feature
@allow-rescue
Scenario: Successfully create Broker
Given I am logged in as "testsuperadmin" with password "testpassword"
When I go to the create broker page
Then show me the page # Authorization denied here, but signed in successfully if this line moved between "Given I am logged in" ... and "When I go to to create broker page"
......
# features/steps/devise_steps.rb
Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |username, password|
#visit path_to(sign in page)
visit "/users/sign_out"
visit "/users/sign_in"
fill_in("user[username]", :with => username)
fill_in("user[password]", :with => password)
click_button("Sign in")
end
# app/controllers/brokers_controller.rb
class BrokersController < ApplicationController
load_and_authorize_resource
# ...
def new
@broker = Broker.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @broker }
end
end