如何仅在Rspec中运行特定测试?


159

我认为有一种方法可以只运行具有给定标签的测试。有人知道吗

Answers:


186

查找文档并不容易,但是您可以使用哈希标记示例。例如。

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

有关GitHub的更多信息。(任何链接更好的人,请指教)

(更新)

RSpec现在在此处得到了很好的记录。有关详细信息,请参见--tag选项部分。

从v2.6开始,通过包含configuration选项treat_symbols_as_metadata_keys_with_true_values,可以更加简单地表示这种标签,该标签允许您执行以下操作:

describe "Awesome feature", :awesome do

:awesome好像在哪里:awesome => true

另请参阅此答案,以了解如何配置RSpec以自动运行“针对性”测试。这对于Guard尤其有效。


所以,你不必去寻找,将直接链接到探究性的建议是在这里(对Rspec的2.12)relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/...
tir38

我们向套件添加了一个规范,以确保代码永远不会与焦点合并:在源代码管理中仍为true。 gist.github.com/jwg2s/7361603
jwg2s

@ jwg2s我使用git钩子阻止的提交:focus,这也防止了诸如“ binding.pry , console.log ”之类的不受欢迎的东西进入代码库。
zetetic

1
@Otheus不,我只是一个粉丝:)我真的很喜欢他们在Relish上所做的事情,但是SO刚刚启动了自己的文档功能,因此我们可能会看到一些竞争。
zetetic '16

1
也许您可以向我指出实际描述该rspec程序的用法和实际行为的文档方式:)因为Relish文档没有。
奥修斯'16


89

在您的spec_helper.rb

RSpec.configure do |config|
    config.filter_run focus: true
    config.run_all_when_everything_filtered = true
end

然后根据您的规格:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

您还可以将测试集中在“ fit”上,或者将测试排除在“ xit”上,如下所示:

fit 'can do so and so' do
    # This is the only test that will run
end

1
在rspec 3.5中,它config.filter_run_when_matching确实可以通过添加:focus示例来起作用
Ali Ghanavatian

4
如果意外提交了“ focus:true”,则即使没有运行大多数测试,您的CI也会通过。
zach

67

或者,您可以传递行号:rspec spec/my_spec.rb:75-行号可以指向单个规范或上下文/描述块(运行该块中的所有规范)


50

您还可以将多个行号与冒号一起输入:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

输出:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}

这真是金子!♂‍♂️
iGbanam

28

作为RSpec的2.4(我猜),你可以在前面加上一个fxitspecifydescribecontext

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

一定要具有config.filter_run focus: trueconfig.run_all_when_everything_filtered = truespec_helper.rb



3

您也可以运行focus: true默认情况下具有的规范

spec / spec_helper.rb

RSpec.configure do |c|
  c.filter_run focus: true
  c.run_all_when_everything_filtered = true
end

然后简单地运行

$ rspec

而且只会进行重点测试

然后,当您删除 focus: true所有测试再次运行

详细信息:https : //www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters


是否spec/spec_helper.rb总是包括在内呢?还是仅当没有给出选项时?为什么测试模块具有require 'spec_helber',而没有上述代码,则通过指定文件消除了运行单个测试的可能性?我找不到与此有关的任何文档。
奥修斯'16

1
spec_helper.rb如果您在项目根目录--require spec_helper.rspec,则始终包含在内。
克里斯,

0

您可以运行为rspec spec/models/user_spec.rb -e "SomeContext won't run this"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.