首页 > 解决方案 > 使用 Devise + Omniauth + Rspec + Capybara 进行集成测试

问题描述

我正在尝试使用 Rspec(功能)以及 Devise 和 Omniauth 编写一些集成测试。我使用的 OAuth 提供程序是azure_activedirectory.

我已经按照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-railsdeviseazure-active-directorycapybaraomniauth

解决方案


我找到了解决方案。

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

解决方案是移动声明

OmniAuth.config.test_mode = true

OmniAuth.config.auth_mocks = NewAuthMock

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


推荐阅读