用于在RSpec中运行所有示例的命令行,包括被过滤掉的示例?

B S*_*ven 12 ruby tdd rspec

有几个缓慢的示例,按如下方式过滤掉:

RSpec.configure do |c|
  c.filter_run_excluding slow: true
end

describe 'get averages but takes a long time', slow: true do
  it 'gets average foo' do
    ....
  end

  it 'gets average bar' do
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

这很好用,不会运行慢速测试.

rspec
Run Code Online (Sandbox Code Playgroud)

但是从命令行运行所有示例的RSpec命令是什么,包括被过滤掉的慢速示例?

Myr*_*ton 25

如果运行rspec --help,则输出包括以下内容:

    -t, --tag TAG[:VALUE]        Run examples with the specified tag, or exclude examples
                                 by adding ~ before the tag.
                                   - e.g. ~slow
                                   - TAG is always converted to a symbol
Run Code Online (Sandbox Code Playgroud)

您可以运行rspec --tag slow以运行标记为慢速的所有示例; 但是,这并没有按照您的意愿运行所有示例.我认为没有一种简单的方法可以得到你想要的东西; 该exclusion过滤器是专为情况下,你不希望在命令行来覆盖它(如基于Ruby版本或什么-它没有任何意义,迫使运行并不适用于你的Ruby版本规范) .您可以打开一个rspec核心问题,以便我们讨论可能的更改以添加您想要的内容.在此期间,您可以使用环境变量来获取它:

RSpec.configure do |c|
  c.filter_run_excluding slow: true unless ENV['ALL']
end
Run Code Online (Sandbox Code Playgroud)

使用此设置,rspec将运行除慢速之外的所有规格,ALL=1 rspec并将运行所有规格,包括慢速规格.


Edw*_*son 7

排除慢速测试

如果你想让rake默认排除慢速测试,Myron的回答可能是你最好的选择.然而,这是一个更简单的解决方案,适用于大多数人.

# Run all tests
rspec

# Run tests, excluding the ones marked slow
rspec --tag ~slow
Run Code Online (Sandbox Code Playgroud)

我在开发过程中使用guard来运行测试.你可以告诉后卫在运行所有测试时排除慢速测试.这样,当你开发你只能运行快速测试,你可以运行完整的套件rakerake --tag slow当你想.这也很棒,因为您的CI服务器可以运行您的完整套件,而无需知道要传入的特殊ENV变量.

Guardfile:

guard :rspec, cli: '--drb', run_all: {cli: '--tag ~slow'} do
  ...
end
Run Code Online (Sandbox Code Playgroud)

当你为它触发一个手表时,Guard仍然会进行慢速测试,就像你在编辑它时一样.