3 votes

Les tests RSpec pour les routes personnalisées de nom d'utilisateur échouent

J'ai un itinéraire contraint qui correspond à des noms d'utilisateur comme celui-ci :

controller :users, :path => '/:username', :as => :user, :constrain => { :username => /^_?[a-z]_?(?:[a-z0-9]_?)*$/i } do
   # lots of nested routes go here
end

Quand je vais écrire des tests RSpec pour cela (par rapport à l'utilisation de user_id comme d'habitude), tous les tests échouent parce qu'il "ne peut pas trouver la route", même si cela fonctionne bien sur le serveur.

describe "for an invalid request" do
  it "should render a 404 if an associated photo is not found" do
    # give it a bad photo id
    xhr :post, :destroy, :id => "999999", :photo_id => "999999", :username => @photo_owner.username
    # not found
    response.status.should == not_found
  end
end

Ce test fonctionnait très bien lorsque j'utilisais l'option user_id dans mes itinéraires avant de passer aux noms d'utilisateur :

resources :users do
  # nested routes
end

y

xhr :post, :destroy, :id => "999999", :photo_id => "999999", :user_id => @photo_owner.id

Alors qu'est-ce que je fais mal et qu'est-ce qui a changé ?

La console de mon serveur affiche ce résultat, ce qui signifie que tous les paramètres doivent être correctement transmis :

Processing by TagsController#destroy as JS
  Parameters: {"constrain"=>{"username"=>/^_?[a-z]_?(?:[a-z0-9]_?)*$/i}, "username"=>"rubynewb", "photo_id"=>"2004-the-title-of-the-photo-here", "id"=>"1797"}

2voto

Substantial Points 4090

Utilisez :constraints => {...} dans la définition de votre itinéraire.

Vous avez un paramètre de trop à passer...

"constrain"=>{"username"=>/^_?[a-z]_?(?:[a-z0-9]_?)*$/i}

Rails ne reconnaît pas :constrain Il est donc transmis avec son contenu en tant que paramètre au lieu d'être traité par le routeur Rails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X