2011-01-12 5 views
0
import grails.plugin.spock.* 

class EventControllerSpec extends ControllerSpec { 

    def "Creating a breadcrumb from an event"() { 
     given: "I have a named event" 
     def eventController = Mock(EventController) 
     def event = Mock(Event) 
     event.title >> 'Space-Journey with Sprock and the Crew' 
     event.title == 'Space-Journey with Sprock and the Crew' 

     when: "I create a breadcrumb from it" 
     def eventCrumb = eventController.createCrumb("Event", "show", "1", event.title) 

     /* 
     private Map createCrumb (String controllerName, String actionName, String id, String msg) { 
     msg = (msg ? msg : "cr.breadcrumb.${controllerName}.${actionName}") 
     [ 'controller':controllerName, 
     'action':actionName, 
     'id':id, 
     'message':msg 
     ] 
     */ 

     then: "I receive a map where the message-value is the events' title" 
     eventCrumb.message == event.title 
    } 
} 

note la commenté méthode qui est dans le EventControllerPourquoi cette méthode renvoie-t-elle une valeur nulle même si le contrôleur sous-jacent est mocké à l'aide de Mock() de Spock?

  1. Pourquoi la cause extrait "Impossible d'obtenir la propriété 'message' sur l'objet null"?
  2. Comment puis-je configurer l'extrait correctement?
  3. En général, est-ce/je ne besoin d'aucune des mockTagLib, mockController, mockLogging fonctions GrailsUnitTestCase lors de l'utilisation Spock?

Répondre

1

Si vous testez un contrôleur à l'unité, il existe une convention qui règle automatiquement le contrôleur pour vous. Référez-vous simplement au controller dans votre test comme suit;

import grails.plugin.spock.* 

class EventControllerSpec extends ControllerSpec { 

    def "Creating a breadcrumb from an event"() { 
    given: "I have a named event" 
    def event = Mock(Event) 
    event.title >> 'Space-Journey with Sprock and the Crew' 

    when: "I create a breadcrumb from it" 
    def eventCrumb = controller.createCrumb("Event", "show", "1", event.title) 

    /* 
    private Map createCrumb (String controllerName, String actionName, String id, String msg) { 
    msg = (msg ? msg : "cr.breadcrumb.${controllerName}.${actionName}") 
    [ 'controller':controllerName, 
    'action':actionName, 
    'id':id, 
    'message':msg 
    ] 
    */ 

    then: "I receive a map where the message-value is the events' title" 
    eventCrumb.message == event.title 
    } 
} 

Vous ne devez cependant, vous pouvez railler explicitement le contrôleur comme ControllerSpec le fait pour vous, besoin de se moquer d'autres éléments que votre contrôleur utilise. Parfois, il suffit d'ajouter ceux-ci à travers la métaclasse du contrôleur

+0

Great! Merci, mfloryan. Lequel, dans ce contexte (?), Est-il la métaclasse des contrôleurs? – user569825

+0

controller.metaClass – mfloryan

+0

Pour les utilisateurs de versions ultérieures de Grails (2.3.x), ce problème semble avoir reculé, maintenant que Spock fait partie des tests Grails par défaut. http://jira.grails.org/browse/GRAILS-11239 – jonnybot

Questions connexes