使用 Devise + Omniauth + Rspec + Capybara 进行集成测试

问题描述

我正在尝试使用 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 就会以正确的配置生成。