34 votes

Rails: Comment modifier les tests d'une ressource imbriquée?

Lors de l'apprentissage de Rails, j'ai créé une application avec un Domains contrôleur de imbriquée ci-dessous un Customers contrôleur. Je suis à l'aide de Rails 2.3.4 et ça a été une expérience d'apprentissage. J'ai réussi à obtenir le dessous de routage mis en place:

    customer_domains GET    /customers/:customer_id/domains(.:format)          {:controller=>"domains", :action=>"index"}
                     POST   /customers/:customer_id/domains(.:format)          {:controller=>"domains", :action=>"create"}
 new_customer_domain GET    /customers/:customer_id/domains/new(.:format)      {:controller=>"domains", :action=>"new"}
edit_customer_domain GET    /customers/:customer_id/domains/:id/edit(.:format) {:controller=>"domains", :action=>"edit"}
     customer_domain GET    /customers/:customer_id/domains/:id(.:format)      {:controller=>"domains", :action=>"show"}
                     PUT    /customers/:customer_id/domains/:id(.:format)      {:controller=>"domains", :action=>"update"}
                     DELETE /customers/:customer_id/domains/:id(.:format)      {:controller=>"domains", :action=>"destroy"}
           customers GET    /customers(.:format)                               {:controller=>"customers", :action=>"index"}
                     POST   /customers(.:format)                               {:controller=>"customers", :action=>"create"}
        new_customer GET    /customers/new(.:format)                           {:controller=>"customers", :action=>"new"}
       edit_customer GET    /customers/:id/edit(.:format)                      {:controller=>"customers", :action=>"edit"}
            customer GET    /customers/:id(.:format)                           {:controller=>"customers", :action=>"show"}
                     PUT    /customers/:id(.:format)                           {:controller=>"customers", :action=>"update"}
                     DELETE /customers/:id(.:format)                           {:controller=>"customers", :action=>"destroy"}
                root        /                                                  {:controller=>"customers", :action=>"index"}

Cependant, tous les tests pour les Domaines de contrôleur sont des échecs dus à des erreurs de routage.

Par exemple le test suivant (généré par les Rails de ressources generator) échoue, comme le font tous les autres tests dans l' DomainsControllerTest classe.

class DomainsControllerTest < ActionController::TestCase
  test "should get index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:domains)
  end
end

Il échoue avec l'erreur:

No route matches {:action => "index", :controller => "domains"}

C'est logique, puisque les routes par défaut n'existent plus et les Domaines contrôleur nécessite un @customer à être mis. J'ai passé un après-midi à la recherche pour le besoin de changement, mais presque tous les site parle des tests Rspec au lieu d'un Rails de tests.

Comment puis-je modifier l' domains_controller_test.rb de sorte qu'il sera de comprendre les imbriquée de ressources?

47voto

Rishav Rastogi Points 12025

Passer le customer_id avec les requêtes ferait l'affaire. Quelque chose comme ça :-

class DomainsControllerTest <ActionController :: TestCase
  test "devrait obtenir index" faire
    get: index,: customer_id => 1
    assert_response: succès
    assert_not_nil assigne (: domaines)
  fin
fin

1voto

ndp Points 8959

Selon vos itinéraires, les domaines n'existent plus en dehors du contexte d'un client. La demande nécessite un customer_id pour que les itinéraires nommés correspondent.

La façon de faire cela dans votre test est:

 test "should get index" do
  get :index, :customer_id=>joe
end
 

1voto

adamonduty Points 1202

Il est un joyau appelé nester qui permet de résoudre ce problème exact. Il génère des méthodes que vous redonner un domains_path et comme si vos routes n'étaient pas imbriquées. Lorsque vos points de vue et des tests de référence, par exemple, domain_path(domain), les voies sont élargies à customer_domain_path(domain.customer, domain). Il y a aussi un ActionController::TestCase helper qui ajoute :customer_id => @domain.customer pour les méthodes comme get, post, etc.

Par défaut généré des tests fonctionnels et des vues de la boîte avec cette approche. (Avertissement: je l'ai écrit).

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