2011-01-26 13 views
6

Mam test integracji Rails 3, który testuje moje trasy. Zawiera testy takie jak:Jak mogę potwierdzić, że żadna z tras nie pasuje do testu integracji Rails?

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

Chciałbym również przetestować przypadek, w którym nie powinny pasować żadne trasy. Oczywiście generowanie testów nie ma znaczenia w tym przypadku, więc potrzebuję odwrotności assert_recognizes. Chciałbym być w stanie zrobić coś takiego:

assert_not_recognized('/adfhkljkdhasjklhjkldfahsjkhdf') 

pomysłów, krótkie owijania assert_recognizes w bloku assert_raises (co nie jest rzeczywiście tak straszne, że teraz o tym myślę)?

Odpowiedz

9

skończyło się w ten sposób:

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 

Nieco głupie, ale dostaje zadanie.

Należy pamiętać, że ten nie obsługuje pracy z Rails 4. See the answer below dla rozwiązania Rails 4.

+0

Nie sądzę, że jest to właściwa odpowiedź, przynajmniej od Rails 4. "assert_recognizes ({} ..." nie powiedzie się, jeśli 1) podana ścieżka nie zostanie w ogóle rozpoznana, lub 2) jeśli jest rozpoznany, ale jako coś innego niż {} (co zawsze powinno mieć miejsce, ponieważ rozpoznana trasa będzie zawierała: action i: klucze kontrolera). –

+0

Naprawdę nie pamiętam, której wersji Rails używałem, kiedy miałem ten problem. To było ponad dwa lata temu. :) –

+0

Mogę potwierdzić, że zadziałało to w Rails 3 (3.2.16), ale kończy się niepowodzeniem w Rails 4 (4.0.2). Dodam kolejny wariant jako osobną odpowiedź. – user569825

-1

Czy próbowałeś już method_missing(selector, *args, &block)? Defined Here

7

Jest podobny sposób na sprawdzenie tego w Rails 4 twierdząc na UrlGenerationError wyjątkiem:

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

DzwoniąC#recognize_path przyzwyczajenie otrzymują fałszywy. Zamiast tego dostaniesz błąd, ale wtedy znalazłeś wskazówkę, której szukałeś.

Powiązane problemy