0

我一直在开发一个用于学习目的的应用程序,其中包括用于 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 添加帮助方法,然后登录与该用户。

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 回答