【问题标题】:How do you run an RSpec independent of the spec helper?如何独立于规范助手运行 RSpec?
【发布时间】:2018-06-04 21:33:56
【问题描述】:

所以我正在构建一个个人库,这意味着我正在制作一个包含几个我在整个项目中常用的特性和行为的 gem。

这个库将有许多不同的部分,每个部分都是为了涵盖特定功能或行为之一。

我希望库做的一件事是让我能够导入所有内容,或者选择我正在处理的项目所需的特定功能。为此,我做了两件事:1)我在它自己的文件夹中设置了每个单独的功能,并使用一个特殊的“导入”文件,该文件需要该功能的所有内容以必要的顺序,2)在顶层创建了两个方法访问那些“导入”文件的 gem:

module MyLibrary 
  def self.import(feature)
    file = get_import_file_for(feature)
    require file
  end

  def self.import_all
    get_all_import_files.each do |file|
      require file
    end
  end
end

我想通过在调用方法之前和之后检查 $LOADED_FEATURES 来测试这两种方法,以确认它们实际上是必需的。

问题是我在规范助手中自动​​调用 MyLibrary.import_all 方法,以便为其余测试(测试特定功能)加载所有内容:

RSpec.configure do |config|
  MyLibrary.import_all
end

一旦调用它,似乎所有测试都已加载,这意味着当测试导入方法时,所有文件都已被要求,因此测试将无法工作。

我该如何解决这个问题? 也许有一种方法可以设置一个规范文件以独立于规范助手运行? 或者以某种方式将该测试设置为始终先运行,然后再需要这些文件?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    也许将您的 MyLibrary.import_all 包装在 $LOADED_FEATURES 的同一检查中,以便仅在您需要时运行它?或者只是检查一个 ENV 变量,这样您就可以运行 DONT_IMPORT_ALL=true ./bin/rspec whatever 来避免导入?

    您的规范帮助文件只是 ruby​​,您可以在其中放入任何您想要的 ruby​​ 逻辑。

    啊,但是如果您问是否有办法让 one 休息运行,其中 一些 测试是在运行 MyLibrary.import_all 的上下文中,而 others 不是——实际上没有任何好的方法可以做到这一点。因为它们都在同一个 ruby​​ 进程中运行,并且MyLibrary.import_all 将对那个 ruby​​ 进程做一些事情,它是 $LOADED_FEATURES,并且没有任何可靠的“撤消”它的好方法。

    您需要在不同的运行中运行您想要包含的规范和它们不包含的规范。

    也许有一种方法可以设置一个规范文件以独立于规范帮助程序运行?

    当然,您也可以这样做 - 仍然受到上述限制。

    通常 rspec 文件在顶部以 require 'spec_helper' 开头。这就是他们运行规范助手的原因。由于这只是 ruby​​,if 你的规范文件在顶部有该行,它将包含规范帮助程序,没有办法绕过它。但它不一定需要顶部的那条线。

    例如,rspec-rails 目前推荐(并设置为模板)两个单独的规范帮助文件 spec_helper.rbrails_helper.rbspec_helper.rb 包括任何规范通用的基本设置,无论它是否使用导轨。然后rails_helper.rb 仅包含特定于rails 的设置,但随后包含require 'spec_helper' 本身。所以现在你的一些规范将在顶部有require 'spec_helper'(它们只需要并执行公共配置),而其他规范将在顶部有require 'rails_helper'——它们执行rails配置 通用配置。

    所以如果你运行rspec spec/a_file_that_requires_rails_helper.rb,你会得到后者;如果你运行rspec spec/a_file_that_just_requires_spec_helper.rb,你会得到前者。

    这仍然是两个不同的运行——仍然无法运行一个 rspec 命令行,其中一些规范在(例如)Rails 正在初始化的上下文中运行,而另一些则没有。在 rspec-rails 推荐的情况下,这样做的目的是让您 运行 just 非 Rails 测试,并且在没有Rails 正在初始化。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多