过滤

RSpec 支持通过多种方式过滤示例和示例组,允许您运行当前感兴趣的测试套件的子集。

按标签过滤

示例和组可以通过匹配命令行或选项文件上声明的标签,或通过 RSpec.configure 声明的过滤器进行过滤,并将哈希键/值提交到示例组和/或示例声明中。例如,给定以下声明

RSpec.describe Thing, :awesome => true do
  it "does something" do
    # ...
  end
end

该组(或任何其他具有 :awesome => true 的组)将通过以下任何命令进行过滤

rspec --tag awesome:true
rspec --tag awesome
rspec -t awesome:true
rspec -t awesome

在标签名前添加 ~ 会否定标签,从而通过以下任何命令排除该组

rspec --tag ~awesome:true
rspec --tag ~awesome
rspec -t ~awesome:true
rspec -t ~awesome

按示例描述过滤

RSpec 提供了 --example(简写形式:-e)选项,允许您通过示例或组的描述来选择它们。所有加载的示例,其完整描述(基于示例的描述及其所有祖先组的描述计算得出)包含提供的参数,都将被执行。

rspec --example "Homepage when logged in"
rspec -e "Homepage when logged in"

您可以多次指定此选项以选择多个示例集

rspec -e "Homepage when logged in" -e "User"

请注意,RSpec 会在这些情况下加载所有规格文件,这可能会产生相当大的启动成本(尤其是对于 Rails 应用程序)。如果您知道目标示例位于特定文件,您也可以传递文件或目录名称,以便 RSpec 只加载这些规格文件,从而加快速度

rspec spec/homepage_spec.rb -e "Homepage when logged in"
rspec -e "Homepage when logged in" spec/homepage_spec.rb

还要注意,没有描述的示例(在使用单行语法时通常会生成描述)无法直接使用此选项进行过滤,因为需要执行示例才能生成描述,因此 RSpec 无法使用尚未生成的描述来决定是否执行示例。当然,您可以传递组描述的一部分来选择组中定义的所有示例(包括那些没有描述的示例)。

按示例位置过滤

可以通过传递定义示例和组的文件和行号(用冒号分隔)来从命令行选择示例和组

rspec spec/homepage_spec.rb:14 spec/widgets_spec.rb:40 spec/users_spec.rb

此命令将运行在 spec/homepage_spec.rb 的第 14 行定义的示例或组,在 spec/widgets_spec.rb 的第 40 行定义的示例或组,以及在 spec/users_spec.rb 中定义的所有示例和组。

如果在指定行没有定义示例或组,RSpec 将运行该行之前定义的最后一个示例或组。

聚焦

RSpec 支持配置选项,可以轻松地通过暂时调整示例来选择它们。在您的 spec_helper.rb(或类似文件)中,添加以下配置

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

此配置由 rspec --init 在推荐的注释部分生成。有了它,您可以使用 :focus 元数据标记任何示例组或示例来选择它

it "does something" do
# becomes...
it "does something", :focus do

RSpec 还附带了常用示例组定义方法(describecontext)和示例方法(itspecifyexample)的别名,这些别名带有前缀 f,并自动包含 :focus => true 元数据,允许您轻松地将 it 更改为 fit(想想“focused it”)、将 describe 更改为 fdescribe 等,以便临时聚焦它们。

选项文件和命令行覆盖

命令行选项声明可以存储在 .rspec~/.rspec$XDG_CONFIG_HOME/rspec/options 或自定义选项文件中。这对于存储默认值很有用。例如,假设您有一些您想要大多数时候都抑制的慢速规格。您可以像这样标记它们

RSpec.describe Something, :slow => true do

然后将它存储在 .rspec

--tag ~slow:true

现在,当您运行 rspec 时,该组将被排除。

覆盖

当然,您可能希望有时运行它们,因此您可以像这样在命令行上覆盖此标签

rspec --tag slow:true

优先级

位置和描述过滤器比标签过滤器具有更高的优先级,因为它们表达了用户运行特定示例的愿望。因此,如果您使用上面的配置,您可以在命令行上指定一个位置或描述来运行一个示例或示例组,该示例或示例组通常由于 :slow 标签而被排除。

RSpec.configure

您还可以使用 RSpec.configure 存储默认标签。我们在命令行(以及在 .rspec 等选项文件中)使用 tag,但出于历史原因,我们在 RSpec.configure 中使用术语 filter

RSpec.configure do |c|
  c.filter_run_including :foo => :bar
  c.filter_run_excluding :foo => :bar
end

这些声明也可以从命令行覆盖。

静默过滤器公告

默认情况下,RSpec 会在您的规格运行之前打印一条消息,指示配置了哪些过滤器,例如,如果您设置了 config.filter_run_including :focus => true,它可能会打印“运行选项:include :focus=>true”。

如果您希望阻止这些消息出现在您的规格输出中,您可以将 silence_filter_announcements 配置设置设置为 true,如下所示

RSpec.configure do |c|
  c.filter_run_including :foo => :bar
  c.silence_filter_announcements = true
end