私は、Facebookログイン用のOmniAuth、BDD用のCucumber、権限と役割用のCanCan&Rolifyなどの学習目的のアプリに取り組んできました。これまでのところ、Deviseは使用されていません。管理者ロールを持つユーザーをログに記録してから、制限されたパスにアクセスするテストを作成しようとしています。また、OmniAuthで作成されたユーザーには、単純な属性があります。ユーザーがサイトの使用を確認された場合、ユーザーは次のことを確認します。1およびconfirmation_token:nil; それ以外の場合は、確認されます:0およびconfirmation_token:。私が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
これは私のSessionsControllerです:
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にヘルパーメソッドを追加してログインします。そのユーザーと。