6

Ho un test di integrazione Rails 3 che verifica i miei percorsi. Contiene test come:Come posso affermare che nessuna rotta corrisponde a un test di integrazione di Rails?

assert_routing(
    "/#{@category.url.path}/#{@foo.url.path}", 
    { :controller => 'foo', :action => 'show', :category => @category.to_param, :foo => @foo.to_param } 
) 

Vorrei anche testare un caso in cui nessun percorso deve corrispondere. Ovviamente, la generazione dei test non ha significato in questo caso, quindi ho solo bisogno dell'inverso di assert_recognizes. Mi piacerebbe essere in grado di fare qualcosa del genere:

assert_not_recognized('/adfhkljkdhasjklhjkldfahsjkhdf') 

Tutte le idee, a corto di assert_recognizes confezionamento in un blocco assert_raises (che in realtà non è così terribile, ora che ci penso su di esso)?

risposta

9

ho finito per fare questo:

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 

Un po 'sciocco, ma ottiene il lavoro fatto.

Si noti che questo non funziona con Rails 4. See the answer below per una soluzione Rails 4.

+0

Non credo che questa è la risposta giusta, almeno per quanto di Rails 4. Le "assert_recognizes ({} ..." avrà esito negativo se uno 1) il percorso specificato non è riconosciuto a tutti, o 2) se è riconosciuto ma come qualcosa diverso da {} (che dovrebbe sempre essere il caso, perché un percorso riconosciuto conterrà: azione e: tasti del controller). –

+0

Non riesco davvero a ricordare quale versione di Rails stavo usando quando ho avuto questo problema. È stato più di due anni fa. :) –

+0

Posso confermare che questo ha funzionato in Rails 3 (3.2.16), ma non riesce in Rails 4 (4.0.2). Aggiungerò un'altra variante come risposta separata. – user569825

-1

Hai provato method_missing(selector, *args, &block)? Definito Here

7

C'è un modo simile per il controllo di questo Rails 4 affermando sul eccezione UrlGenerationError:

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 
2

Chiamando #recognize_path è solito riceve una falsa. Invece avrai un errore, ma poi hai trovato l'indizio che stavi cercando.

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