问题描述
我正在尝试使用 Rspec(功能)以及 Devise 和 Omniauth 编写一些集成测试。我使用的 OAuth 提供程序是 azure_activedirectory
。
我已按照教程 here at the Omniauth wiki
我认为我做得不对。当我启动集成测试时,登录链接 (localhost:3000/omniauth/azure_activedirectory) 的行为就像在开发或生产中一样,链接将客户端定向到 omniauth 门户页面。
当然,鉴于这是一个测试,我无法在此处存储凭据。
从 wiki 链接中的代码看来,它应该改为使用 mock_auth 提供登录信息。
这是我当前的规范代码:
require 'rails_helper'
Capybara.app_host = "http://lvh.me"
OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:azure_activedirectory,{:uid => '12345'})
RSpec.feature "AuthenticatesUser",type: :feature do
before do
Rails.application.env_config["devise.mapping"] = Devise.mappings[:user]
Rails.application.env_config["omniauth.auth"] = OmniAuth.config.mock_auth[:azure_activedirectory]
end
scenario "User can login",js: true do
WebMock.allow_net_connect!
visit '/'
click_link 'login'
binding.pry
WebMock.disable_net_connect!(allow_localhost: true) # Re enable with local host
end
end
那我做错了什么?我觉得我使用示例代码的方式非常不正确或不了解过程。
或者下一步只是设置一个测试 oauth 实例并以这种方式配置它以使用来自 Azure 的实时凭据。
提前感谢您的帮助。
更新
这与 Capybara 和 JS 驱动程序在不同的服务器上启动或运行有关。
如果在 Selenium 浏览器 OmniAuth.config.test_mode == false
的交互式 ruby 控制台中。如果我使用 Web 浏览器中的控制台进行设置,则一切正常。
解决方法
我找到了解决方案。
您不能在规范中将 OmniAuth 置于测试模式。由于带有 js 的水豚在一个单独的线程中,它不知道规范中设置的任何配置。
解决方案是移动声明
OmniAuth.config.test_mode = true
OmniAuth.config.auth_mocks = NewAuthMock
进入 test.rb
环境文件,这样 Capybara 就会以正确的配置生成。