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.
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.
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
config.filter_run_when_matching
and it could work just by adding :focus
to the example
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)
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]}}
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
.
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
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
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.
You can run as rspec spec/models/user_spec.rb -e "SomeContext won't run this"
.
Success story sharing
:focus
, which also prevents undesirables like 'binding.pry,
console.log`, etc. from creeping in to the codebase.rspec
program :) Because the Relish doc does not.