ruby-on-rails - 使用 devise_token_auth +omniauth 请求规范

标签 ruby-on-rails rspec devise omniauth ruby-on-rails-5

我目前正在使用 Rails 5 编写一个 API,使用 devise_token_authomniauth 作为身份验证策略。

为了检查omniauth身份验证是否有效,我编写了一个请求规范:

OmniAuth.config.test_mode = true
OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new(
  {
      provider: 'facebook',
      uid: '123456'
  })
Rails.application.env_config["devise.mapping"] = Devise.mappings[:user]
Rails.application.env_config["omniauth.auth"]  = OmniAuth.config.mock_auth[:facebook]
get '/omniauth/facebook/callback'
expect(response).to have_http_status(:ok)

当我运行测试时,我必须遵循以下错误:

NoMethodError: undefined method `[]' for nil:NilClass
/Users/gaetan/.rvm/gems/ruby-2.3.1/gems/devise_token_auth-0.1.39/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb:14:in `redirect_callbacks'

这是第 14 行:

devise_mapping = [request.env['omniauth.params']['namespace_name'],

所以我猜这是因为 omniauth.paramsnil。这是否意味着我还必须模拟参数?怎么办?

最佳答案

Controller

(例如:Users::OmniauthCallbacksController)

def omniauth_params
  request.env['omniauth.params']
end

规范

allow_any_instance_of(Users::OmniauthCallbacksController).to(receive(:omniauth_params).and_return('namespace_name' => 'namespace_name'))

allow_any_instance_of(Users::OmniauthCallbacksController).to(receive(:omniauth_params).and_return(OmniAuth::AuthHash.new({:namespace_name => 'namespace_name'})))

关于ruby-on-rails - 使用 devise_token_auth +omniauth 请求规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40068599/

相关文章:

ruby-on-rails - rspec 期待空路由

ruby-on-rails - Rails & Devise - 跨子域自动登录

ruby-on-rails - 设备的 reset_password_sent_at 分配

ruby-on-rails-3 - CanCan 独立角色模型

rspec - 如何在不启用旧语法的情况下取消 rspec 3 中的 stub ?

ruby-on-rails - cucumber 未定义方法

javascript - Rails Javascript 使用 Controller 中的数组进行解析

ruby-on-rails - 使用多个条件对列表进行排序 Ruby on Rails

ruby-on-rails - Rails 上的 build 和 new 有什么区别?

ruby-on-rails - 更新到 Ubuntu 16.04 后 mysql2 gem 不工作 - libmysqlclient.so.18