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

时间:2011-02-21 18:21:39

标签: ruby rspec

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

9 个答案:

答案 0 :(得分:174)

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

# 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现在是superbly documented here。有关详细信息,请参阅--tag option部分。

从v2.6开始,这种标记可以通过包含配置选项treat_symbols_as_metadata_keys_with_true_values来更简单地表达,它允许你这样做:

describe "Awesome feature", :awesome do

:awesome视为:awesome => true

另请参阅this answer了解如何配置RSpec以自动运行“聚焦”测试。这对Guard非常有用。

答案 1 :(得分:101)

您可以使用--example (or -e) option运行包含特定字符串的所有测试:

rspec spec/models/user_spec.rb -e "User is admin"

我最常使用那个。

答案 2 :(得分:74)

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

答案 3 :(得分:63)

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

答案 4 :(得分:43)

您还可以将多个行号与冒号:

组合在一起
$ rspec ./spec/models/company_spec.rb:81:82:83:103

输出:

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

答案 5 :(得分:24)

从RSpec 2.4(我猜)开始,您可以将fx添加到itspecifydescribecontext

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: true中有config.run_all_when_everything_filtered = truespec_helper.rb

答案 6 :(得分:3)

此外,您还可以运行默认情况下qZDbuPwNQGrgVmZCU9A7FUWbp8eIfn0Z EwZVoQ5D5SEfdhiRsDfH6dU6tAovILCZ cOqzODVP0GwbiNBwtmqLA78rFgV9d3VT 的规格

规格/ spec_helper.rb

focus: true

然后只需运行

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

只会进行重点测试

然后当您删除$ rspec 时,所有测试都会再次运行

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

答案 7 :(得分:2)

在较新版本的RSpec中,配置支持fit更加容易:

# spec_helper.rb

# PREFERRED
RSpec.configure do |c|
  c.filter_run_when_matching :focus
end

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

请参阅:

https://relishapp.com/rspec/rspec-core/docs/filtering/filter-run-when-matching

https://relishapp.com/rspec/rspec-core/v/3-7/docs/configuration/run-all-when-everything-filtered

答案 8 :(得分:0)

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