J'ai un test d'intégration RAILS 3 qui teste mes itinéraires. Il contient des tests tels que:
assert_not_recognized('/adfhkljkdhasjklhjkldfahsjkhdf')
4 Réponses :
J'ai fini par faire cela:
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
Je ne pense pas que c'est la bonne réponse, au moins comme des rails 4. "Assert_recogniser ({} ..." va échouer si 1) Le chemin donné n'est pas reconnu du tout, ou 2) s'il est reconnu. Mais comme autre chose que {} (qui devrait toujours être le cas, car une voie reconnue contiendra: Action et: Touches de contrôleur).
Je ne me souviens pas vraiment de la version des rails que j'utilisais lorsque j'avais eu cette question. C'était il y a plus de deux ans. :)
Je peux confirmer que cela a travaillé dans des rails 3 (3.2.16), mais échoue dans les rails 4 (4.0.2). Je vais ajouter une autre variante comme réponse séparée.
Dans Rails 5, cela fonctionne pour moi, sauf remplacer l'affirmation reconnaît la déclaration avec le verbe HTTP et l'itinéraire des tests: Obtenez '/ Catégorie / Ceci-Is-NU-NO-A-FOO-NOR-A-BAR'
Je me demande comment tester de manière proprement pour l'indisponibilité du #New code>? Il semble que
neuf code> soit traité comme id i> in
autre / nouveau code> si le routage comprend montrer i> mais pas nouveau I>. Je veux interdire la nouvelle / créer et tester rien n'est appelé là-bas.
Il existe une manière similaire pour vérifier cela dans
En appelant #Recognize_Path Vous ne recevrez pas de faux faux fort>. Au lieu de cela, vous obtiendrez une erreur, mais vous avez trouvé l'indice que vous recherchiez.
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