0

私は、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にヘルパーメソッドを追加してログインします。そのユーザーと。

4

1 に答える 1

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
于 2012-08-26T23:53:33.757 に答える