2012-08-22 2 views
0

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로 로그인하고 해당 사용자와 로그인하십시오.

답변

0

어리석은 나를. 이것은 트릭을했습니다 :

@omniauth_test 
    Given /^I am logged as an admin$/ do 
    @user = FactoryGirl.create(:user, confirmed: 1, confirmation_token: nil) 
    @user.add_role :admin 
    @service = FactoryGirl.create(:service, user: @user, uid: '1234567', provider: 'facebook') 
    end 
관련 문제