ruby-on-rails - 使用 Devise + Omniauth + Rspec + Capybara 进行集成测试
问题描述
我正在尝试使用 Rspec(功能)以及 Devise 和 Omniauth 编写一些集成测试。我使用的 OAuth 提供程序是azure_activedirectory
.
我不认为我做得对。当我启动集成测试时,登录链接 (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 浏览器中的控制台设置它,一切都会“正常工作”。
解决方案
我找到了解决方案。
您不能在规范中将 OmniAuth 置于测试模式。由于带有 js 的 capybara 位于单独的线程中,因此它不知道规范中设置的任何配置。
解决方案是移动声明
OmniAuth.config.test_mode = true
OmniAuth.config.auth_mocks = NewAuthMock
进入test.rb
环境文件,这样Capybara就会使用正确的配置生成。
推荐阅读
- c - 陷入无限循环,不知道我做错了什么
- python-3.x - 是否有用于自动从 Google 趋势中提取数据的循环功能?
- reactjs - React Data Grid,如何删除一行?
- python-3.x - 使用python在眼睛图像中检测瞳孔
- regex - 如何使用正则表达式选择最后一次出现的数字而不是 IP 地址,仅从默认 IIS 日志中删除时间
- java - 在键上加入 2 个无界 Pcollections
- python - 如何在基于 Django 类的表单上编辑文本
- python - 打开文件夹时 VS Code 如何处理文件局部性?
- twitter-bootstrap - bootstrap 4 col 与 ml-auto 右对齐
- python - Matplotlib 不会按照它们出现的顺序打印列表中的值