How can I assert that no route matches in a Rails integration test?

前端 未结 4 1167
予麋鹿
予麋鹿 2020-12-31 17:53

I have a Rails 3 integration test which tests my routes. It contains tests such as:

assert_routing(
    \"/#{@category.url.path}/#{@foo.url.path}\",
    { :c         


        
相关标签:
4条回答
  • 2020-12-31 18:02

    By calling #recognize_path you wont receive a false. Instead you'll get an error, but then you found the clue you were looking for.

    test "No routes match when neither_foo_nor_ bar exist" do
      begin 
        assert_not(Rails.application.routes.recognize_path(
            'category/this-is-neither-a-foo-nor-a-bar'))
      rescue ActionController::RoutingError => error
        assert error.message.start_with? "No route matches"
      end
    end
    
    0 讨论(0)
  • 2020-12-31 18:10

    Have you tried method_missing(selector, *args, &block)? Defined Here

    0 讨论(0)
  • 2020-12-31 18:13

    I ended up doing this:

      def test_no_routes_match_when_neither_foo_nor_bar_exist
        assert_raises(ActionController::RoutingError) do
          assert_recognizes({}, '/category/this-is-neither-a-foo-nor-a-bar')
        end
      end
    

    Slightly silly, but it gets the job done.

    Note that this does not work with Rails 4. See the answer below for a Rails 4 solution.

    0 讨论(0)
  • 2020-12-31 18:21

    There is a similar way for checking this in Rails 4 by asserting on the UrlGenerationError exception:

    def test_no_routes_match_when_neither_foo_nor_bar_exist
      assert_raises(ActionController::UrlGenerationError) do
        get '/category/this-is-neither-a-foo-nor-a-bar'
      end
    end
    
    0 讨论(0)
提交回复
热议问题