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
Usually I do:
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"
2019 Update: Rspec2 switched from the ‘spec’ command to the ‘rspec’ command.
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
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.
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
RSpec.configure do |config| config.filter_run_when_matching :focus end
And then add a focus tag to the
describe to run only that block:
it 'runs a test', :focus do ...test code end
@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.
For single example of spec file you need to add line number at the last , For Example
For single file you can specify your file path, For Example
For Whole Rspec Example in spec folder, you can try with this command
bundle exec rspec spec
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
Run the commands from your project’s root directory:
# run all specs in the project's spec folder bundle exec rspec # run specs nested under a directory, like controllers bundle exec rspec spec/controllers # run a single test file bundle exec rspec spec/controllers/groups_controller_spec.rb # run a test or subset of tests within a file # e.g., if the 'it', 'describe', or 'context' block you wish to test # starts at line 45, run: bundle exec rspec spec/controllers/groups_controller_spec.rb:45
Additionally, you can use the
-e) option to run specific tests that partially or fully match text labels in your ‘it’, ‘describe’, or ‘context’ blocks for the given test path:
# run groups controller specs in blocks with a label containing 'spaghetti flag is false' bundle exec rspec spec/controllers/groups_controller_spec.rb -e 'spaghetti flag is false' # Less granularly, you can run specs for blocks containing a substring of text # that matches one or more block labels, like 'spaghetti' or 'paghett' bundle exec rspec spec/controllers/groups_controller_spec.rb -e spaghetti
This will run all the tests nested inside the blocks with labels matching the string argument received by the example option.
When using the example option, I recommend also appending
--format documentation (shorthand:
-f documentation) to your bundle command (e.g.,
bundle exec rspec spec/some_file.rb -e spaghetti -f documentation). Documentation-formatting replaces the normal
F output with an easy-to-read pretty printed breakdown showing the nested block labels for the examples you’re running and outputs the printed label for each example (
it block) in green or red to denote whether it passed or failed. This provides better confirmation that your example argument matches the specs you intended to run, and it gives live visibility to which examples are passing/failing during longer test runs where the example argument matches many block labels and/or matched blocks contain many nested examples.
Additional Reading (Documentation Links)
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
class TopicsControllerTest < ActionDispatch::IntegrationTest
If You want you can tweak the regex to match to single test method
rails test -n /TopicsControllerTest#test_Should_delete/ -v
You can use
line number should be line number of ‘describe’ or ‘it’ lines so that it will run tests present in that particular block.
instead it will execute all the lines next to line_number.
also you can create block with custom name and then can execute those blocks only.
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
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.
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