配置 Warden 以用于 RSpec 控制器规格

2024-01-04

我能够使用 Devise 的sign_in在我的控制器规格中登录用户的方法。但现在我要从我的应用程序中删除 Devise,我不太确定如何仅使用 Warden 来获得类似的功能。

我应该如何设置spec/spec_helper.rb以及相关的spec/support/*.rb文件以使 Warden 在控制器规格内充分运行?

我尝试在以下位置设置一个文件spec/support/warden.rb包含这些内容:

RSpec.configure do |config|
  config.include Warden::Test::Helpers

  config.after do
    Warden.test_reset!
  end
end

然后我有before类似于此的调用来验证user工厂:

before { login_as FactoryGirl.create(:user) }

但这是我不断看到的错误:

NameError:
  undefined method `user' for nil:NilClass

这个错误可以追溯到我的authenticate_user!控制器中的方法:

def authenticate_user!
  redirect_to login_path, notice: "You need to sign in or sign up before continuing." if env['warden'].user.nil?
end

我将不胜感激任何人都可以提供的指导。


我认为这个问题不适用于我的情况,但它确实适用:对 Warden 进行控制器测试 https://stackoverflow.com/questions/9261191/stubbing-warden-on-controller-tests

事实证明,Warden 并未包含在 RSpec 控制器规格中,因此您需要施展一些魔法才能将其纳入其中。

今井健太郎 https://stackoverflow.com/users/1222666/kentaro-imai's Warden 的控制器测试助手 http://kentaroimai.com/articles/1-controller-test-helpers-for-warden博客文章特别有帮助。以下是我如何让它适用于 RSpec。

Step 1: Create spec/spec_helper/warden.rb并粘贴 Kentaro 从 Devise 导出的这些内容:

module Warden
  # Warden::Test::ControllerHelpers provides a facility to test controllers in isolation
  # Most of the code was extracted from Devise's Devise::TestHelpers.
  module Test
    module ControllerHelpers
      def self.included(base)
        base.class_eval do
          setup :setup_controller_for_warden, :warden if respond_to?(:setup)
        end
      end

      # Override process to consider warden.
      def process(*)
        # Make sure we always return @response, a la ActionController::TestCase::Behavior#process, even if warden interrupts
        _catch_warden {super} || @response
      end

      # We need to setup the environment variables and the response in the controller
      def setup_controller_for_warden
        @request.env['action_controller.instance'] = @controller
      end

      # Quick access to Warden::Proxy.
      def warden
        @warden ||= begin
          manager = Warden::Manager.new(nil, &Rails.application.config.middleware.detect{|m| m.name == 'Warden::Manager'}.block)
          @request.env['warden'] = Warden::Proxy.new(@request.env, manager)
        end
      end

      protected

      # Catch warden continuations and handle like the middleware would.
      # Returns nil when interrupted, otherwise the normal result of the block.
      def _catch_warden(&block)
        result = catch(:warden, &block)

        if result.is_a?(Hash) && !warden.custom_failure? && [email protected] /cdn-cgi/l/email-protection(:performed?)
          result[:action] ||= :unauthenticated

          env = @controller.request.env
          env['PATH_INFO'] = "/#{result[:action]}"
          env['warden.options'] = result
          Warden::Manager._run_callbacks(:before_failure, env, result)

          status, headers, body = warden.config[:failure_app].call(env).to_a
          @controller.send :render, :status => status, :text => body,
            :content_type => headers['Content-Type'], :location => headers['Location']

          nil
        else
          result
        end
      end
    end
  end
end

Step 2: In spec/spec_helper.rb,在RSpec.configure块,添加此行以包含新模块:

config.include Warden::Test::ControllerHelpers, type: :controller

Step 3:登录用户before块,使用类似于以下的语法:

before { warden.set_user FactoryGirl.create(:user) }

Step 4:确保您引用request.env['warden']在你的控制器中,而不是env['warden']。后者在控制器规格中不起作用test环境。

向今井健太郎致敬,我有一天(或在另一世)欠他一杯啤酒!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置 Warden 以用于 RSpec 控制器规格 的相关文章

  • Rails Active Admin css 与 Twitter Bootstrap css 冲突

    我对 Rails 资产管道有点陌生 所以我可能做错了什么 我正在尝试为我的后端使用 Active Admin 为我的前端应用程序使用 twitter bootstrap css 我将 bootstrap css 添加到 应用程序 资产 样式
  • 创建一个简单的 Rails 3 文本助手 Gem [重复]

    这个问题在这里已经有答案了 我一直在开发我的第一个 Rails 3 插件 以打包一个我喜欢在ApplicationHelper我所有的应用程序 你可以看到整个代码在 Github 上 https github com burlesona s
  • 在 Rails 3 中选择性地关闭 Devise 的 Flash 通知

    Devise 身份验证框架在各处都使用 Flash 通知 这使得与应用程序集成变得很容易 但有时会导致用户体验不佳 我想知道有什么简单的方法可以有选择地关闭 Rails 3 应用程序中的一些 Devise flash 通知 特别是 我想摆脱
  • Capistrano 和 XSendFile 配置

    我正在尝试使用 Apache 2 2 Passenger 4 0 59 和 XSendFile 0 12 配置 Rails 生产服务器 应用程序通过 Capistrano 部署 部署的应用程序生成 可能很大 PDF Rails root t
  • Rails 3 + angularjs + 缩小在生产中不起作用:未知提供者:eProvider

    我已遵循我能找到的所有修复缩小的说明 例如 var MyController function renamed scope renamedGreeter MyController inject scope greeter and someM
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • (Rails) Assert_Select 的烦人警告

    有谁知道如何让assert select在rake测试期间不输出所有那些讨厌的html警告 你知道 就像这样的东西 ignoring attempt to close body with div opened at byte 1036 li
  • 我在 Rails 中使用了保留字吗?

    这是我的模型 class Record lt ActiveRecord Base belongs to user belongs to directory end class Directory lt ActiveRecord Base h
  • 浏览器关闭时 Omniauth 会话过期

    在我的 Rails 3 应用程序中 我使用 Omniauth 进行用户身份验证部分 fb twitter 实际上我遵循这个 https github com RailsApps rails3 mongoid omniauth https g
  • 在 Rails 3 中渲染 Markdown 文本

    我想将 markdown 转换为 html 在我看来我有markdown some text variable 但我得到了错误undefined method markdown I added require BlueCoth 到envir
  • 即使在急切加载之后,belongs_to 关联也会单独加载

    我有以下关联 class Picture lt ActiveRecord Base belongs to user end class User lt ActiveRecord Base has many pictures end 在我的
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 资产管道:仅对一个控制器使用 javascript 文件

    在 Ruby on Rails v4 中 我希望仅为特定控制器加载一个 js 文件 或一组 js 文件 执行此操作的标准方法是什么 在 application js 中有 require tree 线 我假设这需要删除 所以我并不总是加载每
  • 服务器上的 Rails 会话

    我想让一些 Rails 应用程序在不同的服务器上共享同一个会话 我可以在同一服务器内完成此操作 但不知道是否可以在不同服务器上共享 有人已经做过或者知道怎么做吗 Thanks Use the 数据库会话存储 https github com
  • 从父应用程序重新打开 Rails 3 引擎类

    就目前而言 您无法重新打开引擎中包含的引擎类 app只需在父应用程序的目录中添加相同的类即可 app目录 例如 my engine app controllers users controller rb my app app control
  • Rails/Ruby 合并两个具有相同键、不同值的哈希值

    我有两个想要合并的哈希值 它们看起来像这样 Hello gt 3 Hi gt 43 Hola gt 43 第二个哈希看起来像 Hello gt 4 Hi gt 2 Bonjour gt 2 我想合并这两个哈希数组 使结果看起来像 Hello
  • Rails 资源单数还是复数?

    我有一条搜索路线 我想将其设为单数 但是当我指定单数路线时 它仍然会生成复数控制器路线 这是应该的样子吗 resource search Gives me search POST search format action gt create
  • Rails 安全:完全避免大规模分配

    我倾向于不需要批量分配 http guides rubyonrails org security html mass assignment我的生产代码中的功能 在我的测试代码中 我经常使用它 但在这些情况下我do想要设置任意列 因此 如果在

随机推荐

  • 使用 jwt 和许多角色进行基于角色的访问

    我有一个带有许多控制器的 Web api 通过这些控制器 我定义了很多角色并装饰了控制器 功能 为了访问 api 我使用 jwt 我尝试将我的角色写入 jwt 之类的键值中 这工作正常 但如果我在 jwt 中设置许多角色 令牌就会变得非常大
  • Bootstrap 3.1.0:附加太长

    我在用引导程序3 1 0 当 附加 对于视口来说太长时 它会被切断 永远不会显示底部项目 是否有可能让 Bootstrap 的词缀以用户仍然可以从上到下滚动完整词缀的方式运行 有问题的例子 div class container div c
  • Python 中列的绝对值

    如何将 计数 列的值转换为绝对值 我的数据框的摘要如下 datetime count 0 2011 01 20 00 00 00 14 565996 1 2011 01 20 01 00 00 10 204177 2 2011 01 20
  • Python快速异或超范围算法

    有一个编程挑战 需要生成一个XOR基于序列起始号和间隔长度的校验和 它要求您根据间隔长度迭代序列 并在每次迭代时不断减少为校验和计算选取的元素数量 Example 如果起始编号是0间隔长度为3 该过程将如下所示 0 1 2 3 4 5 6
  • java中堆内存和字符串常量池有什么区别

    In Java 使用创建的对象新操作员将被存储在堆 记忆 使用创建的对象字符串字面量存储在 这字符串常量池 我正在运行以下代码来检查哈希码 String nameOne Deepak String nameTwo new String De
  • 混合手动\自动编号序列

    在编号顺序设置 CS201010 中 有一个手动编号选项 但是 取决于文档类型 在某些情况下 参考编号可以留空 如果它是空白的 我希望自动编号启动 或者在保存文档之前调用 NextNumber 函数 是否可以 我怎么做 目前 如果我强制执行
  • 相当于其他编译器中gcc/clang的march=native?

    我想知道除了 gcc 和 clang 之外是否还有其他编译器提供类似 march native选项 如果有 该选项是什么 我已经从另一个问题中明白了 在 Visual C 中自动构建最佳可用平台 相当于 gcc 的 march native
  • 为什么 const 成员必须在构造函数初始值设定项中初始化,而不是在其主体中初始化?

    为什么类成员必须声明为const在构造函数初始值设定项列表中而不是在构造函数主体中初始化 两者有什么区别 在 C 中 当执行进入构造函数主体时 对象被视为完全初始化 你说 我想知道为什么 const 必须在构造函数初始值设定项列表中而不是在
  • stateChangeStart 中从子状态访问父状态的参数

    有没有办法从父状态获取参数 我的州看起来像这样 stateProvider state home url home param1 template div home div
  • 在 django-rest-framework 验证器中为整数字段强制指定整数类型

    django rest framework 验证器接受字符串引用的整数作为整数字段的有效数据 有没有办法强制规定数据类型 以便不接受字符串引用的整数 序列化器将原始数据保存在self initial data自定义验证方法可以从中检索它 所
  • 如何在 Android 应用程序中将 putExtra() 与 FLAG_ACTIVITY_REORDER_TO_FRONT 一起使用?

    我有一个应用程序 称为 App1 在我的 App1 中 我调用相机应用程序 intent new Intent Intent ACTION MAIN intent setComponent new ComponentName com and
  • 在 C# 中,“DateTime”类型中的“?”是什么?[重复]

    这个问题在这里已经有答案了 我刚刚在使用 System DirectoryServices AccountManagement 时遇到了一些代码 public DateTime LastLogon get 是什么 在日期时间之后 我找到了一
  • java.sql.Array/Blob/Clob 类型是否需要“free()”?

    我需要明确的电话吗free 在数组 clob 等上 或者关闭 ResultSet 和 或 Statement 会自动解决这个问题吗 javadoc 没有说什么 所以我认为这是没有必要的 但我不想做出错误的假设 另外 如果没有必要 立即关闭结
  • 如何更改力布局中节点之间的距离?

    我是 D3 的新手 正在尝试学习力布局 我想改变节点之间的链接距离并保持原点形状 我发现在更改链接的距离后 布局发生了变化 图一是原来的布局 然后我用代码改变了链接距离distance 150 第80行 使节点更进一步 但布局的变化超出了我
  • 如何使用 OpenXml 将外部图像添加到 Word 文档?

    我正在尝试使用 C 和 Open XML 将图像从 url 插入到文档中 该图像可能会发生变化 因此我不想下载它 我希望它保留为外部参考 我发现了几个像这样的例子 可以让我添加本地图像 http msdn microsoft com en
  • Ember模型间隔重载

    我有一个用户模型 它具有纬度和经度属性 用于在地图上显示当前用户位置 App User DS Model extend firstName DS attr string lastName DS attr string email DS at
  • 使用 Java 发出并发 Web 请求

    有人可以指出我用于发出并行网络请求的片段吗 我需要发出 6 个 Web 请求并连接 HTML 结果 有没有一种快速的方法来完成这个任务 或者我必须采用线程方式 谢谢 Use ExecutorService http download ora
  • 在 HTML5 Canvas 中绘制图像,同时保留图像

    在HTML5 Canvas中 最简单的绘制方式是什么and move图像上的一条线 已经在画布上 保留下面的图像 例如 有一条垂直线跟踪鼠标 X 位置 我当前的画布 document ready function canvas docume
  • 如何在Java中使用变量执行SQL语句

    我有以下 mysql 语句来从正在运行的数据库中删除记录 SET email email protected cdn cgi l email protection SET userID SELECT id FROM USER WHERE e
  • 配置 Warden 以用于 RSpec 控制器规格

    我能够使用 Devise 的sign in在我的控制器规格中登录用户的方法 但现在我要从我的应用程序中删除 Devise 我不太确定如何仅使用 Warden 来获得类似的功能 我应该如何设置spec spec helper rb以及相关的s