如何独立于规范助手运行RSpec?

时间:2018-06-03 16:21:49

标签: ruby rspec

所以我建立了一个个人的图书馆,这意味着我制作的宝石由我在整个项目中经常使用的几个特征和行为组成。

此库将包含许多不同的部分,每个部分都是为了涵盖特定功能或行为之一而构建的。

我希望图书馆做的一件事就是让我能够导入所有内容,或者选择我正在进行的项目所需的特定功能。要做到这一点,我做了两件事:1)我在其自己的文件夹中设置了每个单独的功能,并带有一个特殊的“导入”功能。文件以必要的顺序需要该功能的所有内容,并且2)在gem的顶层创建两个方法来访问那些' import'文件:

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

一旦这个被调用,似乎所有的东西都被加载到剩下的测试中,这意味着当它需要测试导入方法的时候,所有的文件都已经被要求了,所以测试赢得了#39; t work。

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

1 个答案:

答案 0 :(得分:0)

也许将你的MyLibrary.import_all包裹在$ LOADED_FEATURES的相同支票中,只在你想要的时候运行它?或者只是检查ENV变量,以便运行DONT_IMPORT_ALL=true ./bin/rspec whatever以避免导入?

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

啊,但是如果你问是否有办法让一个休息运行,那么某些的测试都在MyLibrary.import_all的上下文中正在运行,其他不是 - 没有任何好方法可以做到这一点。因为它们都在同一个ruby进程中运行,并且MyLibrary.import_all将对ruby进程执行操作并且它是$ LOADED_FEATURES,并且没有任何好的方法可靠地“撤消”它。

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

  

也许有办法设置一个spec文件独立于spec helper运行?

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

通常,rspec文件的顶部是require 'spec_helper'。这就是他们运行规范助手的原因。由于这只是ruby,如果你的spec文件在顶部有该行,它将包含spec帮助器,没有办法解决它。但它并不一定需要顶部的那条线。

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

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

这仍然是两个不同的运行 - 仍然没有办法运行一个rspec命令行,其中一些规范在(例如)Rails被初始化的情况下运行,而其他规则没有。在rspec-rails推荐的情况下,这一点的目的是让你运行只是非rails测试,并且更快设置时间没有Rails正在初始化。

希望这会有所帮助。