Der*_*ill 7 integration-testing rspec ruby-on-rails devise omniauth
继Devise和OmniAuth上的Railscast之后,我实现了一个OmniauthCallbacksController < Devise::OmniauthCallbacksController包含一个处理OmniAuth回调的方法:
def all
  user = User.from_omniauth(request.env["omniauth.auth"])
  if user.persisted?
    sign_in_and_redirect user
  else
    session["devise.user_attributes"] = user.attributes
    redirect_to new_user_registration_url
  end
end
alias_method :facebook, :all
routes.rb中:
devise_for :users, controllers: {omniauth_callbacks: "omniauth_callbacks", :sessions => "sessions" }
我想自定义这个,所以我试图用RSpec测试它.问题是如何测试此方法和重定向?
如果在规范中我把user_omniauth_callback_path(:facebook)它不抱怨路线不存在,但似乎并没有实际调用该方法.
根据这个答案 "控制器测试使用四个HTTP动词(GET,POST,PUT,DELETE),无论你的控制器是否是RESTful." 我试过get user_...等但是在这里确实抱怨路线不存在.事实上,如果我这样做,rake routes则显示此路线没有HTTP动词:
user_omniauth_callback [BLANK] /users/auth/:action/callback(.:format) omniauth_callbacks#(?-mix:facebook)
你能看到我错过的东西吗?
编辑
所以在这个问题之后,调用该方法的一种方法是:
controller.send(:all)
然而,我遇到了提问者遇到的同样错误:
ActionController::RackDelegation#content_type delegated to @_response.content_type, but @_response is nil
你需要做三件事来完成这件事.
这是一个可能的解决方案,在规范本身中输入(例如spec/feature/login_spec.rb)...
let(:current_user) { FactoryGirl.create(:user) }
before do
  OmniAuth.config.test_mode = true
  OmniAuth.config.mock_auth[:facebook] = OmniAuth::AuthHash.new({
    provider: :facebook,
    uid:'12345',
    info: {
      name: "Joe"
    }
  })
  User.stub(:from_omniauth).and_return(current_user)
end
我从谷歌身份验证中调整了这一点,因此Facebook可能需要更多字段,但这些是omniauth docs所需的唯一字段.您应该能够通过查看数据库模式并查找与文档匹配的字段来查找正确的字段.
在我的情况下,最小值足以通过请求阶段并转移到返回我的用户的stubed out方法.
此示例还使用FactoryGirl.
它可能不完美,但我希望它有所帮助.祝好运!
-担
| 归档时间: | 
 | 
| 查看次数: | 1169 次 | 
| 最近记录: |