簡體   English   中英

如何使用Rails,Omniauth和Rspec對Facebook登錄操作進行單元測試

[英]How to Unit Test Facebook Login Action with Rails, Omniauth and Rspec

之前我問了一個類似的問題,但我想我已經超過了原來的錯誤。 無論如何,我有一個新的樂趣失敗,我正在試圖弄清楚(注意諷刺)。 這是我的失敗:

1) SessionsController#facebook_login should be valid
   Failure/Error: get :facebook_login
   NoMethodError:
     undefined method `slice' for nil:NilClass
   # ./app/models/user.rb:19:in `from_omniauth'
   # ./app/controllers/sessions_controller.rb:22:in `facebook_login'
   # ./spec/controllers/sessions_controller_spec.rb:96:in `block (3 levels) in <top (required)>'

sessions_controller_spec.rb

describe '#facebook_login' do

  before(:each) do
    valid_facebook_login_setup
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
    get :facebook_login
  end

  it "should be valid" do
    expect(response).to be_success
  end

  it "should set user_id" do
    expect(session[:user_id]).to be_true
  end
end

sessions_controller.rb

def facebook_login
  if request.env['omniauth.auth']
    user = User.from_omniauth(env['omniauth.auth'])
    session[:user_id] = user.id
    redirect_back_or root_path
  else
    redirect_to root_path
  end
end

omn​​iauth_test_helper.rb

module OmniAuthTestHelper
  def valid_facebook_login_setup
    if Rails.env.test?
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
        provider: 'facebook',
        uid: '123545',
        info: {
          first_name: "Andrea",
          last_name:  "Del Rio",
          email:      "test@example.com"
        },
        credentials: {
          token: "123456",
          expires_at: Time.now + 1.week
        }
      })
    end
  end

  def facebook_login_failure
    OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
  end
end

spec_helper.rb

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
  config.include Capybara::DSL
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"
  config.include SessionTestHelper, type: :controller
  config.include OmniAuthTestHelper, type: :controller
end

user.rb

class User < ActiveRecord::Base

  def self.from_omniauth(auth)
    where(auth.slice(:provider, :uid)).first_or_create do |user|
      user.provider = auth.provider
      user.uid = auth.uid
      user.first_name = auth.info.first_name
      user.last_name = auth.info.last_name
      user.email = auth.info.email
      user.password = auth.credentials.token
      user.password_confirmation = auth.credentials.token
      user.oauth_token = auth.credentials.token
      user.oauth_expires_at = Time.at(auth.credentials.expires_at)
    end
  end
end

任何幫助都會非常酷。 多謝你們!

好的,我把這些測試留待了,但我終於想到了解決這個問題。 首先,因為它是一個回調,它不應該是一個控制器測試。 它應該是一個請求規范。 因此,當給出模擬將登錄用戶時,我們將測試“/ auth / facebook / callback”。

規格/請求/ user_sessions_request_spec.rb

require 'spec_helper'

describe "GET '/auth/facebook/callback'" do

  before(:each) do
    valid_facebook_login_setup
    get "auth/facebook/callback"
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]
  end

  it "should set user_id" do
    expect(session[:user_id]).to eq(User.last.id)
  end

  it "should redirect to root" do
    expect(response).to redirect_to root_path
  end
end

describe "GET '/auth/failure'" do

  it "should redirect to root" do
    get "/auth/failure"
    expect(response).to redirect_to root_path
  end
end

這是rspec助手

規格/支持/ omni_auth_test_helper

module OmniAuthTestHelper
  def valid_facebook_login_setup
    if Rails.env.test?
      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
        provider: 'facebook',
        uid: '123545',
        info: {
          first_name: "Gaius",
          last_name:  "Baltar",
          email:      "test@example.com"
        },
        credentials: {
          token: "123456",
          expires_at: Time.now + 1.week
        },
        extra: {
          raw_info: {
            gender: 'male'
          }
        }
      })
    end
  end
end

不要忘記在spec_helper中包含該模塊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM