Do routing specs support redirect routes? [RSpec]

前端 未结 5 1648
暗喜
暗喜 2021-02-05 02:49

After digging fairly deeply on this issue, I\'ve come to an impasse between my understanding of the documentation and my results.

According to https://www.relishapp.com/

相关标签:
5条回答
  • 2021-02-05 03:12

    Andy Lindeman has the correct answer. However, you don't have to put the spec in spec/requests, you can keep it in spec/routing and be explicit with the metadata "type": describe 'my route', type: :request do

    0 讨论(0)
  • 2021-02-05 03:19

    I was running into a similar case where I was trying to test a series of routes, some which should redirect and some which shouldn't. I wanted to keep them in a single routing spec, since that was the most logical way to group them.

    I tried using describe: 'my route', type: request, but found that not to work. However, you can include RSpec::Rails::RequestExampleGroup in your spec context to gain access to the request spec methods. Something like:

    describe "My Routes" do
      context "Don't Redirect" do
        it "gets URL that doesn't redirect" do
          get("business_users/internal_url").should route_to(controller: "business_users", action: "internal_url_action")
        end
      end
    
      context "Redirection" do
        include RSpec::Rails::RequestExampleGroup
        it "redirects to google.com" do
          get "/business_users/1/external_url"
          response.should redirect_to("http://www.google.com")
        end
      end
    end
    
    0 讨论(0)
  • 2021-02-05 03:26

    The simplest way to test external redirects is to use an integration test:

      test "GET /my_page redirects Google" do
        get "/my_page"
        assert_redirected_to "https://google.com"
      end
    

    You test needs to be under your test/integration directory or the equivalent directory where the integration tests should go.

    0 讨论(0)
  • 2021-02-05 03:29

    Routing specs/tests specialize in testing whether a route maps to a specific controller and action (and maybe some parameters too).

    I dug into the internals of Rails and Journey a bit. RSpec and Rails (basically, some details left out) use Rails.application.routes.recognize_path to answer the question "is this routable?"

    For example:

    $ rails console
    > Rails.application.routes.recognize_path("/business_users/1", method: "GET")
     => {:action=>"show", :controller=>"business_users", :id=>"1"}
    

    However, there's no controller on the other end of /business_users/1/external_url. In fact, to perform the redirect, Rails has created an instance of ActionDispatch::Routing::Redirect, which is a small Rack application. No Rails controller is ever touched. You're basically mounting another Rack application to perform the redirection.

    To test the redirect, I recommend using a request spec instead (a file in spec/requests). Something like:

    require "spec_helper"
    
    describe "external redirection" do
      it "redirects to google.com" do
        get "/business_users/1/external_url"
        response.should redirect_to("http://www.google.com")
      end
    end

    This tests the route implicitly, and allows you to test against the redirection.

    0 讨论(0)
  • 2021-02-05 03:36

    I think you want the redirect_to matcher.

    0 讨论(0)
提交回复
热议问题