我一直在开发一个用于学习目的的应用程序,其中包括用于 Facebook 登录的 OmniAuth、用于 BDD 的 Cucumber 以及用于权限和角色的 CanCan & Rolify。到目前为止没有使用任何设计。我正在尝试编写一个测试,该测试涉及记录具有管理员角色的用户,然后访问受限路径。此外,使用 OmniAuth 创建的用户具有简单的属性:如果用户已被确认使用该站点,则他/她将已确认:1 和确认令牌:无;否则将被确认:0 和确认令牌:。如果我不在 Cucumber 环境中,这个想法实际上是有效的,但是在其中,页面给了我一个 CanCan::AccessDenied 错误。哦,我还设置了 OmniAuth 测试模式,效果很好, env["omniauth.auth"] 返回一个正确的模拟哈希。
这是我的测试(我还在学习,所以请耐心等待)
@omniauth_test
Given /^I am logged as an admin$/ do
#ensure no session is active
visit '/signout'
@user = FactoryGirl.create(:user, confirmed: 1, confirmation_token: nil)
@user.add_role :admin
visit root_url
click_link "log_in" #means going to '/auth/facebook/callback'
end
And /^I check the user list$/ do
visit users_path #fails
end
这是我的用户工厂,没什么复杂的:
FactoryGirl.define do
factory :user do |u|
u.email 'test@example.com'
end
end
这是我的会话控制器:
class SessionsController < ApplicationController
def create
reset_session
service = Service.from_omniauth(env["omniauth.auth"])
session[:user_id] = service.user.id
session[:service_id] = service.id
session[:expires_at] = 5.minutes.from_now
if service.user.confirmed == 0
redirect_to edit_user_path(service.user)
elsif service.user.confirmed == 1
if service.user.has_role? :member
redirect_to root_url
elsif service.user.has_role? :admin
redirect_to users_path
else
redirect_to root_url, :notice => "Work in progress!"
end
end
end
最后,Service.rb:
class Service < ActiveRecord::Base
attr_accessible :user_id, :provider, :uid, :name, :token, :updated_at
validates_uniqueness_of :uid, :scope => [:provider]
belongs_to :user
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_initialize.tap do |service|
if !service.user
user = User.create(:email => auth.info.email)
service.user = user
#for some reason, instance variable @user created by FactoryGirl is nil at this point (test env)
user.add_role :signedup
end
service.provider = auth.provider
service.uid = auth.uid
service.name = auth.info.name
service.token = auth.credentials.token
service.save!
end
end
我想要以某种方式使用 OmniAuth 哈希并仅为测试模式添加管理员角色和确认的属性,而不会过多地混淆生产代码(如果可能的话),可能会向 env.rb 添加帮助方法,然后登录与该用户。