Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何独立于spec助手运行RSpec?_Ruby_Rspec - Fatal编程技术网

Ruby 如何独立于spec助手运行RSpec?

Ruby 如何独立于spec助手运行RSpec?,ruby,rspec,Ruby,Rspec,因此,我正在构建一个各种各样的个人库,这意味着我正在制作一个由我在整个项目中常用的几个特性和行为组成的gem 该库将有许多不同的部分,每个部分都是为了涵盖某个特定功能或行为而构建的 我希望库能做的一件事是让我能够导入所有内容,或者为我正在处理的项目选择所需的特定功能。为此,我做了两件事:1我在自己的文件夹中为每个功能设置了一个特殊的“导入”文件,该文件要求该功能的所有内容都按必要的顺序进行,2在gem的顶层创建了两个方法来访问这些“导入”文件: module MyLibrary def s

因此,我正在构建一个各种各样的个人库,这意味着我正在制作一个由我在整个项目中常用的几个特性和行为组成的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_特性来测试这两个方法,以确认它们实际上是必需的

问题是,我正在自动调用spec helper中的MyLibrary.import_all方法,以便为测试特定功能的其余测试加载所有内容:

RSpec.configure do |config|
  MyLibrary.import_all
end
一旦调用了这个函数,就好像为其余的测试加载了所有内容,这意味着当需要测试导入方法时,所有文件都已被要求,因此测试将无法工作

我怎样才能解决这个问题? 也许有一种方法可以设置一个等级库文件以独立于等级库助手运行? 或者以某种方式将该测试设置为总是在需要这些文件之前首先运行?

也许可以将MyLibrary.import\u全部打包到相同的$LOADED\u功能检查中,以便仅在需要时运行它?或者只需检查一个ENV变量,就可以运行DONT_IMPORT_ALL=true./bin/rspec which来避免导入

您的spec助手文件就是ruby,您可以在其中放入任何您想要的ruby逻辑

啊,但是如果你问是否有一种方法可以运行一个rest,其中一些测试在MyLibrary.import_的上下文中,所有测试都在运行,而其他测试都不在运行,那么没有什么好的方法可以做到这一点。因为它们都在同一个ruby进程中运行,MyLibrary.import\u都将对该ruby进程和它的$LOADED\u特性进行操作,所以没有任何可靠的“撤销”方法

您需要运行您想要包含的规格,以及它们在不同运行中不包含的规格

也许有一种方法可以设置一个等级库文件以独立于等级库助手运行

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

通常rspec文件以顶部的require'spec\u helper'开头。这就是为什么他们要运行spec助手。因为这只是ruby,如果您的spec文件在顶部有这一行,它将包括spec helper,没有办法绕过它。但它不一定需要在顶部的那条线

例如,rspec rails目前推荐并设置两个单独的等级库辅助文件spec_helper.rb和rails_helper.rb作为模板。spec_helper.rb包括任何规范都通用的基本设置,无论它是否使用rails。然后rails\u helper.rb只包括特定于rails的设置,但它本身需要“spec\u helper”。因此,现在您的一些规范的顶部将有require'spec\u helper',它们只需要并执行公共配置,而其他规范的顶部将有require'rails\u helper',它们执行rails配置和公共配置

因此,如果您运行rspec spec/a_file_,而_需要_rails_helper.rb,则会得到后者;如果您运行rspec spec/a_file_,而该文件只需要\u spec\u helper.rb,那么您将得到前者

这仍然是两种不同的运行方式——仍然无法运行一个rspec命令行,其中一些规范在初始化eg-Rails的上下文中运行,而另一些规范则不运行。在rspec-rails推荐案例中,这样做的目的是让您可以只运行非rails测试,并且在不初始化rails的情况下有更快的设置时间

希望这有帮助