2010-05-17 2 views
6

J'ai une méthode de commande comme tel:Unité testant une méthode de contrôleur?

def search = { 
    def query = params.query 

      ... 

    render results as JSON 
} 

Comment puis-je tester l'unité cela? Plus précisément, comment puis-je appeler la recherche pour définir params.query, et comment puis-je tester les résultats de la méthode render? Y at-il un moyen de se moquer de la méthode de rendu, peut-être?

Répondre

5

Sous-classe grails.test.ControllerUnitTestCase pour vos tests unitaires. Grails instancie automatiquement votre contrôleur et simule des versions de rendu et de redirection qui vous permettent de tester facilement les résultats. Attribuez simplement les entrées de test à controller.params pour configurer le test.

Exemple:

class SomethingController { 
    def search = { 
     def query = params.query 
     ...stuff... 
     render results as JSON 
    } 
} 

Le test ressemble à:

class SomethingControllerTests extends grails.test.ControllerUnitTestCase { 
    void testSearch() { 
     controller.params.query = "test query" 
     controller.search() 
     assertEquals "expected result", controller.response.contentAsString 
    } 
} 

Remarque: vous pouvez utiliser ControllerUnitTestCase pour les tests d'intégration aussi, si vous avez besoin d'un environnement d'intégration complète avec la base de données.

0

Il existe deux façons de tester le contrôleur unitaire, mais certaines modifications seront nécessaires. La première consiste à tester le contrôleur lui-même, sans ajouter la complexité de l'analyse http, de sorte que vous écrivez votre test unitaire et transmettez la params.query dans le cadre de votre test unitaire, divisez votre fonction de recherche en deux fonctions:

def search = { 
    def query = params.query 
    render realSearch(query) as JSON 
} 

def realSearch ... 

Ainsi, la première partie des tests realSearch. Ensuite, la deuxième partie consiste à écrire une application qui se connectera réellement à votre application Web, et à faire un test fonctionnel, qui testera l'ensemble de votre application, y compris les parties du contrôleur qui n'ont pas été testées dans la première partie .

0

TFM: Grails ref chapter 9

Suivez l'exemple ... juste farcir votre chaîne de requête testCreateWithJSON() dans params [ 'query'], définissez le contentType, la recherche d'appel(). Puisque vous appelez explicitement render, la chose la plus simple serait de regarder le response.contentAsString ... Je ferais probablement juste une correspondance de pattern sur le contentAsString; vous pourriez le ré-analyser comme JSON et ensuite examiner cet arbre d'objets, mais je soupçonne que cela ne va pas être aussi clair/rapide que de simples assertions de type pattern-match.

Questions connexes