为 RSpec 套件中的所有示例设置一次变量(不使用全局变量)

2024-02-26

设置变量一次以供 RSpec 套件中的所有示例使用的传统方法是什么?

我目前在中设置了一个全局变量spec_helper检查规范是否正在“调试模式”下运行

$debug = ENV.key?('DEBUG') && (ENV['DEBUG'].casecmp('false') != 0) && (ENV['DEBUG'].casecmp('no') != 0)

如何在不使用全局变量且不重新计算每个上下文和/或示例的值的情况下,使该信息可供套件中的所有示例使用? (我的理解是使用before(:all)block 会根据上下文重新计算一次;但是,那个before(:suite)不能用于设置实例变量。)

(注意:我要求更多的知识来了解解决这个特定问题的良好设计。我知道一个全局并不是什么大问题。)


为此,我通常编写自定义模块,将其包含在spec_helper.rb file.

假设我正在测试后端 API,并且我不想每次都解析 JSON 响应正文。

spec/
spec/spec_helper.rb
spec/support/request_helper.rb
spec/controllers/api/v1/users_controller_spec.rb

我首先在 support 子文件夹下的模块中定义一个函数。

# request_helper.rb
module Request
  module JsonHelpers
    def json_response
      @json_response ||= JSON.parse(response.body, symbolize_names: true)
    end
  end
end

然后我默认为某些测试类型包含此模块

#spec_helper.rb
#...
RSpec.configure do |config|
  config.include Request::JsonHelpers, type: :controller
end

然后我使用测试中定义的方法。

# users_controller_spec.rb
require 'rails_helper'

RSpec.describe Api::V1::UsersController, type: :controller do
  # ...

 describe "POST #create" do

    context "when is successfully created" do
      before(:each) do
        @user_attributes = FactoryGirl.attributes_for :user
        post :create, params: { user: @user_attributes }
      end

      it "renders the json representation for the user record just created" do
        user_response = json_response[:user]
        expect(user_response[:email]).to eq(@user_attributes[:email])
      end

      it { should respond_with 201 }
    end
end

对于您的情况,您可以创建一个模块,例如

module EnvHelper
  def is_debug_mode?
    @debug_mode ||= ENV['DEBUG']
  end
end

然后你可以包含它并简单地使用该方法is_debug_mode?在你的测试中。

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

为 RSpec 套件中的所有示例设置一次变量(不使用全局变量) 的相关文章

  • 不同金额的 Stripe 订阅计划

    我正在为一家慈善机构制作一份捐赠表格 他们要求提供每月捐赠计划 用户可以选择他们想要捐赠的任何金额 我知道我可以制定个人计划 即 如果他们说每月捐款 5 美元 10 美元或 20 美元 我可以制定三个不同的计划并向用户订阅它们 有没有办法避
  • 通过名称查找进程ID

    如何在 Ruby 中通过名称或完整命令行找到 pid 而不调用外部可执行文件 我正在将 SIGUSR2 发送到命令行包含的进程ruby job rb 我想在不打电话的情况下执行以下操作pgrep uid Process uid pid pg
  • RubyMine 不能使用 Guard 吗?

    由于某些无法解释的原因 RubyMine 会自动保存您所做的每一个更改 因此每次击键都会触发 Guard 运行您的测试 最可笑的是 显然没有办法禁用这个自动保存 功能 我只是想知道 RubyMine 似乎是 Rails 开发人员中非常流行的
  • 在 Rails 3.2 + SimpleForm 中显示嵌套表单有错误的字段

    我有一个Flight模型嵌套在一个FlightLog模型 AFlightLog可能包含许多航班 我使用 SimpleForm 进行引导安装 这样当验证失败时 可以用错误类包围带有错误的表单元素 问题是 即使触发了嵌套模型的验证 simple
  • 尝试使用适用于 Windows XP 的 Heroku 时未找到 msvcrt-ruby18.dll

    我有一个学生在 Windows XP 上进行开发 他在尝试运行时遇到了一个奇怪的错误heroku keys add 错误是 This application has failed to start because msvcrt ruby18
  • 使用 Ruby on Rails 进行设计 - 强制用户在首次登录时更改密码

    我有一个运行 Devise 的 RoR 应用程序 Rails 4 2 Ruby 2 2 0 我已经进行了设置 以便管理员用户 标识了我添加到用户模型中的 is admin 布尔值 能够创建新的用户帐户 为他们提供生成的密码和确认电子邮件 这
  • 如何在 Ruby 中列出局部变量?

    def method a 3 b 4 some method that gives a b end 局部变量 http ruby doc org core Kernel html method i local variables 它输出符号
  • 验证 ActionCable 连接

    我发现了一个很棒的 ActionCable gem 它是 SPA 的一个很好的解决方案 我只想发送html css and js资产 所有其他连接将通过ActionCable 交换字符串或者整数并不难 但是如何通过ActionCable登录
  • Perl 中的全局变量、子程序变量问题

    如何将子程序变量值转移到另一个子程序变量中 我可以使用全局变量吗 sub foo my myvar Hello sub foo1 my myvar1 myvar how can I get the Hello from myvar 我尝试使
  • rvm编译安装ruby 2.5.0出错

    我正在尝试使用 rvm 安装 ruby 2 5 0 但出现错误 我在 Ubuntu 18 16 和现在的 Linux Mint Cinnamon 上尝试过 基本上我在运行安装 ruby 的代码之前所做的是 打开 GPG 密钥https rv
  • gets、gets.chomp 和 gets.chomp 之间的区别!?

    这三者有什么区别 gets 它得到一行带有 n gets chomp 它得到一行 但删除 n 那是对的吗 关于什么gets chomp gets http www ruby doc org core 2 1 0 Kernel html me
  • Mongoid - 同一外域的两个域的逆

    我试图让以下 Mongoid 关系发挥作用 但每个团队的游戏字段都是一个空数组 这不是一个有效的关系模型吗 我是否需要分开比赛 即主场比赛和客场比赛 class Team include Mongoid Document has many
  • 如何干净地处理全局变量?

    我有许多 aspx 页面 50 我需要在每个页面中声明一些 5 7 全局变量 一个页面中的变量独立于其他页面 即使有些变量可能相同 目前我在页面顶部和任何函数之外声明 我应该采取不同的方法吗 这种方法有副作用吗 如果完全重复 请告诉我 谢谢
  • Rails 4 - 如何链接到 PDF 文件(名称.PDF)?

    我正在生成 PDF 文件 我的链接如下所示 当我点击这个时 它会带我去 display invoice 123456789 这是一个 HTML 版本 在控制器中的操作如下 def display invoice if params invo
  • 通过推送通知唤醒

    Suppose 有一些对象 例如 一个数组a 和依赖于对象的条件 例如 a empty 当前线程以外的某些线程可以操作该对象 a 因此条件评估值的真实性会随着时间的推移而变化 如何让当前线程在代码中的某个时刻休眠 并在条件满足时通过推送通知
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • Ruby 中的任务/未来

    代表潜在延迟的异步计算并且可以订阅其完成的模式的惯用 Ruby 模拟是什么 即类似于 NET 的东西System Threading Task 或Python 3 xconcurrent futures future 请注意 这并不一定意味
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Rails 3 在 Ruby 1.9.2 上初始化非常慢

    我使用 RVM 来管理环境 安装了 Ruby 1 9 2 p136 我认为是最新版本 和 Rails 3 创建了 gemset 并运行捆绑器 到目前为止一切正常 但 Rails 在运行命令 即生成 销毁 rake 等 时初始化速度非常慢 完

随机推荐

  • 两个不相等的浮点数相减是否可以得到0?

    在下面的例子中是否可以除以 0 或无穷大 public double calculation double a double b if a b return 0 else return 2 a b 当然 在正常情况下不会 但如果a and
  • 无法在 Ubuntu 中使用 setup.py 中的 Github Actions 安装 Tensorflow 2.2.0rc0

    当我尝试安装时tensorflow gt 2 2 0rc0 from setup py跑步python setup py install从 Github Actions 工作流程中 输出向我发送以下内容 Searching for tens
  • MongoError:不允许用户执行操作

    我使用 MongoDB Atlas 作为我的数据库 我使用 angular4 和环回作为 api 我的应用程序可以正常连接到我的数据库 但是 当我尝试获取数据时 出现此错误 我已将我的 dbname 替换为 dbname MongoErro
  • R/LaTeX 表创建包的建议

    我一直在使用xtable很长一段时间以来 并期待着用 R 编写我的第一个包 所以我认为 如果我有一些值得实施的 酷 想法 那么很有可能有人在我之前到达那里 我对专门用于 LaTeX 表创建的函数 包感兴趣 当然是通过 R 我撞上了quant
  • 如何复制 Google 工作表并保留其项目触发器和脚本?

    我目前有一个 Google 表格 用作主模板 也就是说 我会为每个请求制作该模板的副本 我想向我的主模板添加一个 Google 应用程序脚本 当工作表完成后 它会在编辑时发布到我的服务器 该脚本将被复制并为此模板的每个副本运行 我已经尝试从
  • 是否应该确保 IDisposable.Dispose() 可以安全地多次调用?

    应实施IDisposable make Dispose 多次拨打安全吗 或者相反 大多数 NET Framework 类采用什么方法 具体来说 打电话安全吗 System Data Linq DataContext Dispose 多次 我
  • 建立 iTunes 商店的联属链接而不进行重定向?

    苹果公司在 从 iPhone 应用程序启动 App Store http developer apple com library ios qa qa1629 index html 如何建立一个到应用商店的联属链接并在后台处理重定向 这样就不
  • LLDB GUI 的文档

    我最近一直在研究 LLDB 的 GUI 功能 有关此功能的 stackoverflow 链接有描述here https stackoverflow com questions 19820247 is there a tui mode for
  • MongoDB 3.2 身份验证失败

    我使用以下命令集创建一个用户 这应该在两者中创建用户admin数据库以及我的目标数据库 c2d mongo 127 0 0 1 27017 MongoDB shell version 3 2 6 29 g5c19788 connecting
  • 使用epplus创建.xlsm文件

    我正在尝试让网站导出 xlsm 文件 但似乎找不到任何有帮助的内容 这是我用来测试构建 xlsx 文件 有效 的一个简单示例 using OfficeOpenXml div Change file extension to xlsm to
  • 如何在 PHP 中解析日期字符串?

    日期字符串为Apr 30 2010 我怎样才能将字符串解析为2010 04 30使用 PHP 使用 DateTime API 需要 PHP 5 3 dateTime DateTime createFromFormat F d Y Apr 3
  • 表达请求 .query.xyz 作为字符串 |细绳[]

    我正在尝试为我的变量分配一个类型 该变量从express 请求查询中获取其值 req query 的类型为 QueryString ParsedQs 例如 req query accountId 的类型为 string QueryStrin
  • 是否有一个玩笑配置会导致 console.warn 测试失败?

    如何配置笑话测试以因警告而失败 console warn stuff fail test 您可以使用这个简单的覆盖 let error console error console error function message error a
  • R 的 xtsum 命令?

    我们正在处理面板数据 Stata中有一个命令 xtsum 这给出了数据集中变量的内部方差和方差之间 R 是否有类似的命令可以产生干净的输出 我用了一个小函数来做到这一点 函数 XTSUM 接受三个输入 数据 数据集varname xtsum
  • C# 嵌套 Try Catch 语句或方法?

    简单的最佳实践问题 应该嵌套 try catch 语句还是只使用方法 例如 如果您有一个打开文件的方法确实有效并关闭该文件 那么您将在 try catch 之外进行打开和关闭 或者更确切地说 在 finally 块中进行关闭 现在 如果您的
  • 如何为 'a:before' 和 'a:after' 编写 ':hover' 条件?

    我怎样才能写 hover and visited的条件a before 我想a before hover 但它不起作用 这取决于您实际想要做什么 如果您只是想将样式应用到 before伪元素 当a元素匹配一个伪类 你需要写a hover b
  • 将结构体转换为数组是否合法?

    考虑以下 Just a sequence of adjacent fields of same the type repr C derive Debug struct S
  • 使用 MongoDB 与 MySQL 与大量 JSON 字段?

    有一种微博类型的应用程序 两个主要的基本数据库存储是 MySQL 或 MongoDB 我计划对大量数据进行非规范化 即对帖子进行的投票存储在投票表中 并且主帖子表中的计数也会增加 该帖子还涉及其他操作 例如点赞 投票否决 如果我使用 MyS
  • WindowManager:MainActivity 泄露了原始窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@40731aa0

    这个警告是什么意思 我开发了一个 Android 应用程序 我在 logcat 中看到了这个警告 此警告不会导致关闭应用程序 一切都运行没有任何问题或中断 但它是否会导致一些在我的应用程序中看不到的问题 Continue logcat at
  • 为 RSpec 套件中的所有示例设置一次变量(不使用全局变量)

    设置变量一次以供 RSpec 套件中的所有示例使用的传统方法是什么 我目前在中设置了一个全局变量spec helper检查规范是否正在 调试模式 下运行 debug ENV key DEBUG ENV DEBUG casecmp false