The Life‑Changing Magic of Ruby and Rails

Running a Single Test with Spaces in Minitest

In Rails, if you want to run a specific test without the others in the file, you can pass the method’s name to the --name flag.

def test_controller_name
  # assert ...
end

>  ruby -I test test/controller/renderer_test.rb --name test_controller_name

But, Rails also provides a test method that takes a test name and a block.

test "creating from a controller" do
  # assert ...
end

How do you run this test that allows you to pass a string containing spaces?

For this, we need to step inside the test method and see what it’s doing. If we open the source code for the test method, this is what it does:

def test(name, &block)
  test_name = "test_#{name.gsub(/\s+/, '_')}".to_sym
  defined = method_defined? test_name
  raise "#{test_name} is already defined in #{self}" if defined
  if block_given?
    define_method(test_name, &block)
  else
    define_method(test_name) do
      flunk "No implementation provided for #{name}"
    end
  end
end

The first line replaces all the spaces in the name string with an underscore _, and adds a test at the beginning. So, the test name creating from a controller becomes test_creating_from_a_controller. Then, using metaprogramming, it defines a method with that same name. So the above test method becomes:

def test_creating_from_a_controller
  # assert ...
end

Now that you know the name, you can run this test as follows:

>  ruby -I test test/controller/renderer_test.rb -n test_creating_from_a_controller

Hope this helps.

Subscribe to Akshay's Blog

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe