Omniauth 测试错误,Devise/Rails/Rspec

Omniauth Testing Error, Devise/Rails/Rspec

感谢任何意见。 这是我得到的确切错误。我不明白为什么。

No route matches {:action=>"users/auth/:facebook", :controller=>"omniauth_callbacks"} missing required keys: [:action]

-spec/controllers/omniauth_callbacks_controller_spec.rb

    require 'rails_helper'

    RSpec.describe OmniauthCallbacksController, type: :controller do

    def set_omniauth(opts = {})
      default = {:provider => :facebook,
                 :uuid     => "1234",
                 :facebook => {
                                :email => "foobar@example.com",
                                :gender => "Male",
                                :first_name => "foo",
                                :last_name => "bar"
                      }
                }

      credentials = default.merge(opts)
      provider = credentials[:provider]
      user_hash = credentials[provider]

      OmniAuth.config.test_mode = true

      OmniAuth.config.mock_auth[provider] = {
        'uid' => credentials[:uuid],
        "extra" => {
        "user_hash" => {
          "email" => user_hash[:email],
          "first_name" => user_hash[:first_name],
          "last_name" => user_hash[:last_name],
          "gender" => user_hash[:gender]
          }
        }
      }
    end

    def set_invalid_omniauth(opts = {})

      credentials = { :provider => :facebook,
                      :invalid  => :invalid_crendentials
                     }.merge(opts)

      OmniAuth.config.test_mode = true
      OmniAuth.config.mock_auth[credentials[:provider]] = credentials[:invalid]

    end 

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

      before(:each) do
        set_omniauth
        request.env["devise.mapping"] = Devise.mappings[:user]
        request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:facebook]

        get "users/auth/facebook"
        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
    end
    end

提前感谢任何可以阐明一些想法或至少给我一些想法的人。

由于您正在编写控制器测试,因此您应该在 get 调用中提供控制器操作,而不是实际的 url,如下所示:

get :facebook

或者,您可以将测试更改为 request spec,这样您将测试整个堆栈,并且它可以与 url.

一起使用