【问题标题】:Integration Testing with Devise + Omniauth + Rspec + Capybara使用 Devise + Omniauth + Rspec + Capybara 进行集成测试
【发布时间】:2021-04-30 14:09:14
【问题描述】:

我正在尝试使用 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 浏览器的交互式 ruby​​ 控制台中OmniAuth.config.test_mode == false。如果我使用 Web 浏览器中的控制台设置它,一切都会“正常工作”。

【问题讨论】:

    标签: ruby-on-rails devise azure-active-directory capybara omniauth


    【解决方案1】:

    我找到了解决办法。

    您不能在规范中将 OmniAuth 置于测试模式。由于带有 js 的 capybara 在单独的线程中,它不知道规范中设置的任何配置。

    解决方案是移动声明

    OmniAuth.config.test_mode = true
    
    OmniAuth.config.auth_mocks = NewAuthMock
    

    进入test.rb 环境文件,这样Capybara 将使用正确的配置生成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多