2009-11-04 12 views
1

Je fais des tests de contrôleurs avec RSpec et Mocha. Voici un exempleTests de contrôleurs de passage de variable en cours

describe MenuItemsController, "creating a new menu item" do 
    integrate_views 
    fixtures :menu_items 

    it "should redirect to index with a notice on successful save" do 
    MenuItem.any_instance.stubs(:valid?).returns(true) 
    post 'create' 
    assigns[:menu_item].should_not be_new_record 
    flash[:notice].should_not be_nil 
    response.should redirect_to(menu_items_path) 
    end 
end 

J'ai quelques questions concernant cet exemple

  1. Où se trouve la documentation de la méthode post (et d'autres verbes REST)?

  2. Comment l'objet créé par

    MenuItem.any_instance.stubs (:?) Valide. Rendement (true)

    sont transmis à l'action du contrôleur? En quoi la question 2 diffère-t-elle de la transmission directe des paramètres au contrôleur via la méthode de post-traitement?

+0

bonnes réponses. Je vous remercie!! – stellard

Répondre

0

1.

Pour Post

Pour Get

Pour Put

Pour Delete

2.

Ce n'est pas vraiment passé. Vous configurez votre scénario de test de sorte que, étant donné qu'un appel à est valide? est faite par une instance de MenuItem. Ensuite, votre talon sera utilisé et le résultat de cette valide? vérifier sera vrai. Vous décidez ce qui va être retourné par ce valide? appel

3.

Lorsque vous stub, lorsque le test, au lieu d'exécuter le code normalement, pour cette spécifique valide? sur une instance de MenuItem; votre code n'essaiera pas de déterminer si votre menuItem est valide ou non. Il retournera simplement la valeur que vous avez spécifiée dans vos talons. Dans votre cas, true

Ainsi, ici, vous ne testez pas que votre instance MenuItem renvoie la valeur true, étant donné un paramètre correct, mais vous testez ce qui se passe lorsque votre instance MenuItem renvoie la valeur true.

Ce n'est peut-être pas vraiment utile pour vous si vous pouvez facilement configurer un article avec un paramètre qui donnera toujours valid? == true pour votre article MenuInstance.

Mais par exemple lorsque vous avez un morceau de code qui se connecte à un WebService, vous pouvez utiliser un talon qui retourne Connection Non disponible pour tester ce qui se passe dans votre code lorsque le Webservice est en baisse.

+2

Les liens vers la documentation ne sont plus valides. – aardvarkk

0
  1. Vous pouvez trouver de la documentation pour les méthodes REST de test dans le Rails docs

  2. L'objet ne se transmet pas au contrôleur, il est créé par le contrôleur. MenuItem.any_instance.stubs(:valid?).return(true) assure que instance de MenuItem créé dans le contexte de vos spécifications renverra true pour la méthode valid?. L'objectif principal des méthodes de décollement est d'isoler ce que vous testez. Si vous transmettez vos paramètres au contrôleur au lieu de supprimer uniquement les méthodes dont vous avez besoin pour tester votre contrôleur, vous testez maintenant votre contrôleur et votre modèle. Puisque vous avez probablement vos modèles ailleurs, la duplication ne sert qu'à rendre vos spécifications plus compliquées et fragiles.

    Stubbing la méthode valid? pour revenir true est l'option d'entretien plus faible par rapport à passer tous les params nécessaires pour que votre déclaration de modèle true lui-même.

+0

Le lien vers la documentation n'est plus valide. – aardvarkk