ChatGPT解决这个技术问题 Extra ChatGPT

How do I run only specific tests in Rspec?

I think there's a way to run only tests with a given label. Anybody know?


N
Nikita Fedyashev

You can tag examples with :focus hash attribute. For example,

# spec/foo_spec.rb
RSpec.describe Foo do
  it 'is never executed' do
    raise "never reached"
  end

  it 'runs this spec', focus: true do
    expect(1).to eq(1)
  end
end
rspec --tag focus spec/foo_spec.rb

More info on GitHub. (anyone with a better link, please advise)

(update)

RSpec is now superbly documented on relishapp.com. See the --tag option section for details.

As of v2.6 this kind of tag can be expressed even more simply by including the configuration option treat_symbols_as_metadata_keys_with_true_values, which allows you to do:

describe "Awesome feature", :awesome do

where :awesome is treated as if it were :awesome => true.

Also, see this answer for how to configure RSpec to automatically run 'focused' tests. This works especially well with Guard.


So you don't have to go searching, the direct link to zetetic's suggestion is here (for Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/…
We added a spec to our suite to ensure code never gets merged with focus: true still in source control. gist.github.com/jwg2s/7361603
@jwg2s I use a git hook to block commits with :focus, which also prevents undesirables like 'binding.pry, console.log`, etc. from creeping in to the codebase.
@Otheus no, I'm just a fan :) I really like what they did on Relish, but SO just launched its own documentation feature, so we may see some competition.
Maybe you can point me in the way of documentation that actually describes usage and actual behavior of the rspec program :) Because the Relish doc does not.
J
Joel Handwell

You can run all tests that contain a specific string with --example (or -e) option:

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

I use that one the most.


R
Rory O'Kane

Make sure RSpec is configured in your spec_helper.rb to pay attention to focus:

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

Then in your specs, add focus: true as an argument:

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

You can also focus tests by changing it to fit (or exclude tests with xit), like so:

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

In rspec 3.5, it is config.filter_run_when_matching and it could work just by adding :focus to the example
If 'focus: true' is accidentally committed your CI will be passing despite not running most of the tests.
A
Alex Lang

alternatively you can pass the line number: rspec spec/my_spec.rb:75 - the line number can point to a single spec or a context/describe block (running all specs in that block)


N
Nick

You can also string multiple line numbers together with colon :

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

Output:

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

This is so gold! 🙇🏾‍♂️
J
Joshua Muheim

As of RSpec 2.4 (I guess) you can prepend an f or x to it, specify, describe and context:

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

Be sure to have config.filter_run focus: true and config.run_all_when_everything_filtered = true in your spec_helper.rb.


j
jwfearn

In newer versions of RSpec, it's even easier to configure support 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

See:

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


i
itsnikolay

Also you can run specs which have focus: true by default

spec/spec_helper.rb

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

Then simply run

$ rspec

and only focused test will be run

then when you remove focus: true all tests well be run again

More information: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters


Is spec/spec_helper.rb always included ? Or only if no options are given? Why do test modules have require 'spec_helber', and doesn't having the above code eliminate the possibility of running a single test by specifying the file? I can't find any documentation on this.
spec_helper.rb is always included if you have --require spec_helper in .rspec in the project root.
P
Pyrce

You can run as rspec spec/models/user_spec.rb -e "SomeContext won't run this".