module ActionDispatch::Assertions::RoutingAssertions

def assert_recognizes(expected_options, path, extras = {}, msg = nil)

assert_recognizes({controller: 'items', action: 'show', id: '1'}, 'view/item1')
# Test a custom route

assert_recognizes({controller: 'items', action: 'destroy', id: '1'}, 'items/destroy/1')
# Test an action with a parameter

assert_recognizes({controller: 'items', action: 'list'}, 'items/list')
# Test a specific action

assert_recognizes({controller: 'items', action: 'index'}, 'items')
# Check the default route (i.e., the index action)

The +message+ parameter allows you to pass in an error message that is displayed upon failure.

assert_recognizes({controller: 'items', action: 'list', id: '1', view: 'print'}, 'items/list/1', { view: "print" })
# Asserts that a path of '/items/list/1?view=print' returns the correct options

argument because appending the query string on the path directly will not work. For example:
to assert that values in the query string will end up in the params hash correctly. To test query strings you must use the extras
You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used

assert_recognizes({controller: 'items', action: 'create'}, {path: 'items', method: :post})
# Asserts that POSTing to /items will call the create action on ItemsController

and a +:method+ containing the required HTTP verb.
requiring a specific HTTP method. The hash should contain a +:path+ with the incoming request path
Pass a hash in the second argument (+path+) to specify the request method. This is useful for routes

match +path+. Basically, it asserts that \Rails recognizes the route given by +expected_options+.
Asserts that the routing of the given +path+ was handled correctly and that the parsed options (given in the +expected_options+ hash)
def assert_recognizes(expected_options, path, extras = {}, msg = nil)
  if path.is_a?(Hash) && path[:method].to_s == "all"
    [:get, :post, :put, :delete].each do |method|
      assert_recognizes(expected_options, path.merge(method: method), extras, msg)
    end
  else
    request = recognized_request_for(path, extras, msg)
    expected_options = expected_options.clone
    expected_options.stringify_keys!
    msg = message(msg, "") {
      sprintf("The recognized options <%s> did not match <%s>, difference:",
              request.path_parameters, expected_options)
    }
    assert_equal(expected_options, request.path_parameters, msg)
  end
end