URI::InvalidURIError: bad URI(is not URI?) testing Rails controllers
Solution 1
Controller tests inherit from ActionController::TestCase
, while your test
inherits from ActionDispatch::IntegrationTest
. So you're using an integration test and not a controller test.
The error is:
That doesn't look right, does it? ;-)
The solution is to use a full path:
get '/index'
Remember, integration tests aren't really tied to any specific controller (or anything else, for that matter). They test the integration of several components in your application. So if you're testing the index
action of a UserController
you'd probably need to use /users/index
.
If you intended to make a controller test and not an integration test, you want to set the correct superclass. Using get :index
(for the index method) should work fine then.
Solution 2
You can try:
get home_index_path
instead of:
get :index
Related videos on Youtube

Luca G. Soave
Updated on June 21, 2022Comments
-
Luca G. Soave 5 months
I get
URI::InvalidURIError
testing Rails Home controller:require 'test_helper' class HomeControllerTest < ActionDispatch::IntegrationTest test "should get index" do get :index assert_response :success end end
get the following error:
E Error: HomeControllerTest#test_should_get_index: URI::InvalidURIError: bad URI(is not URI?): http://www.example.com:80index test/controllers/home_controller_test.rb:7:in `block in <class:HomeControllerTest>'
The stack is the following:
Rails 5.0.0.beta3 minitest (5.8.4)
-
Luca G. Soave over 6 yearshey, I didn't see that 'ActionDispatch::IntegrationTest' in my controller tests at all ... I'm digging into that
-
Luca G. Soave over 6 years... strange, it seems that in Rails 5.0.0.beta3, scaffold generator is producing test controllers like that by default/design ...
-
Martin Tournoij over 6 years@LucaG.Soave Taht seems strange ... I don't really use the generator tools myself much, but maybe you're invoking it wrong? In any case, integration tests don't differ too much from controller tests, and AFAIK everything you can do in a controller test, you can do in an integration test (but not the other way around). I prefer to just use integration tests myself.
-
ArtOfCode over 6 years@Carpetsmoker Integration tests have replaced TestCase in Rails 5.
-
Nischay Namdev almost 6 years
put :update, id: @product, product: @update
how to write this thing in the url form, Im getting same error -
filbranden over 2 yearsWhile following the examples of a Rails 4 book on latest Rails (6.0.3.2), I bumped into these issues. I found this blog article "Changes to test controllers in Rails 5" to be quite useful, explaining the change of the test superclass to
ActionDispatch::IntegrationTest
and the deprecated/droppedassigns
andassert_template
methods and the rationale for the change.