OmniAuth for Facebook 로그인, Cucumber for BDD 및 CanCan & 권한 및 역할에 대한 롤리프를 학습 목적으로 앱에서 작업 해 왔습니다. 지금까지는 Devise가 사용되지 않았습니다. 나는 관리자 역할을 가진 사용자를 로깅 한 다음 제한된 경로를 방문하는 테스트를 작성하려고합니다. 또한 OmniAuth로 작성된 사용자는 단순한 속성을 갖습니다. 사용자가 사이트를 사용하도록 확인 된 경우, 사용자는 다음을 확인합니다. 1 및 confirmation_token : nil; 그렇지 않으면 확인 될 것입니다 : 0 및 confirmation_token :. 이 아이디어는 오이 환경에 있지 않은 경우 실제로 작동하지만 그 안에 페이지는 CanCan :: AccessDenied 오류를 제공합니다. 아, 그리고 OmniAuth 테스트 모드도 설정했습니다. env [ "omniauth.auth"]는 적절한 mock 해시를 반환합니다. 이것은 내 SessionsController입니다OmniAuth 로그인 기능을 통해 Cucumber가 테스트를 통과하지 못하도록
FactoryGirl.define do
factory :user do |u|
u.email '[email protected]'
end
end
:
이
은@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
이 사용자에 대한 내 공장 복잡 아무것도 (난 여전히 나와 함께 부담 때문에 학습하지거야) 내 테스트입니다
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로 로그인하고 해당 사용자와 로그인하십시오.