How to run a single RSpec test?
I have the following file:
What command in terminal do I use to run just that spec and in what directory do I run the command?
My gem file:
# Test ENVIRONMENT GEMS group :development, :test do gem "autotest" gem "rspec-rails", "~> 2.4" gem "cucumber-rails", ">=0.3.2" gem "webrat", ">=0.7.2" gem 'factory_girl_rails' gem 'email_spec' end
require 'spec_helper' describe GroupsController do include Devise::TestHelpers describe "GET yourgroups" do it "should be successful and return 3 items" do Rails.logger.info 'HAIL MARRY' get :yourgroups, :format => :json response.should be_success body = JSON.parse(response.body) body.should have(3).items # @user1 has 3 permissions to 3 groups end end end
Not sure how long this has bee available but there is an Rspec configuration for run filtering - so now you can add this to your spec_helper.rb:
RSpec.configure do |config| config.filter_run_when_matching :focus end
And then add a focus tag to the it, context or describe to run only that block:
it 'runs a test', :focus do ...test code end
Usually I do:
Where 42 represents the line of the test I want to run.
You could also use tags. See here.
bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
rake spec SPEC=path/to/spec.rb
(Credit goes to this answer. Go vote him up.)
EDIT (thanks to @cirosantilli): To run one specific scenario within the spec, you have to supply a regex pattern match that matches the description.
rake spec SPEC=path/to/spec.rb \ SPEC_OPTS="-e \"should be successful and return 3 items\""
You can pass a regex to the spec command which will only run it blocks matching the name you supply.
spec path/to/my_spec.rb -e "should be the correct answer"
My preferred method for running specific tests is slightly different - I added the lines
RSpec.configure do |config| config.filter_run :focus => true config.run_all_when_everything_filtered = true end
To my spec_helper file.
Now, whenever I want to run one specific test (or context, or spec), I can simply add the tag "focus" to it, and run my test as normal - only the focused test(s) will run. If I remove all the focus tags, the run_all_when_everything_filtered kicks in and runs all the tests as normal.
It's not quite as quick and easy as the command line options - it does require you to edit the file for the test you want to run. But it gives you a lot more control, I feel.
There are many options:
rspec spec # All specs rspec spec/models # All specs in the models directory rspec spec/models/a_model_spec.rb # All specs in the some_model model spec rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn' rspec -e"text from a test" # Runs specs that match the text rspec spec --tag focus # Runs specs that have :focus => true rspec spec --tag focus:special # Run specs that have :focus => special rspec spec --tag focus ~skip # Run tests except those with :focus => true
@apneadiving answer is a neat way of solving this. However, now we have a new method in Rspec 3.3. We can simply run rspec spec/unit/baseball_spec.rb[#context:#it] instead of using a line number. Taken from here:
RSpec 3.3 introduces a new way to identify examples[...]
For example, this command:
$ rspec spec/unit/baseball_spec.rb[1:2,1:4] …would run the 2nd and 4th example or group defined under the 1st top-level group defined in spec/unit/baseball_spec.rb.
So instead of doing rspec spec/unit/baseball_spec.rb:42 where it (test in line 42) is the first test, we can simply do rspec spec/unit/baseball_spec.rb[1:1] or rspec spec/unit/baseball_spec.rb[1:1:1] depending on how nested the test case is.
In rails 5,
I used this way to run single test file(all the tests in one file)
rails test -n /TopicsControllerTest/ -v
Class name can be used to match to the desired file TopicsControllerTest
My class class TopicsControllerTest < ActionDispatch::IntegrationTest
If You want you can tweak the regex to match to single test method \TopicsControllerTest#test_Should_delete\
rails test -n /TopicsControllerTest#test_Should_delete/ -v
starting with rspec 2 you can use the following:
# in spec/spec_helper.rb RSpec.configure do |config| config.filter_run :focus => true config.run_all_when_everything_filtered = true end # in spec/any_spec.rb describe "something" do it "does something", :focus => true do # .... end end
For model, it will run case on line number 5 only
bundle exec rspec spec/models/user_spec.rb:5
For controller : it will run case on line number 5 only
bundle exec rspec spec/controllers/users_controller_spec.rb:5
For signal model or controller remove line number from above
To run case on all models
bundle exec rspec spec/models
To run case on all controller
bundle exec rspec spec/controllers
To run all cases
bundle exec rspec
Given you're on a rails 3 project with rspec 2, From the rails root directory:
bundle exec rspec spec/controllers/groups_controller_spec.rb
should definitely work. i got tired of typing that so i created an alias to shorten 'bundle exec rspec' to 'bersp'
'bundle exec' is so that it loads the exact gem environment specified in your gem file: http://gembundler.com/
Rspec2 switched from the 'spec' command to the 'rspec' command.
I use this guard gem to auto-run my test. It execute test after create or update operations on test file.
or usually you can run using following command
You can do something like this:
rspec/spec/features/controller/spec_file_name.rb rspec/spec/features/controller_name.rb #run all the specs in this controller