Warum kehrt diese Methode null, obwohl die zugrundeliegenden Controller verspottet wird mit Spocks' Mock ()?

StackOverflow https://stackoverflow.com/questions/4671828

Frage

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
    }
}

beachten Sie die Methode auf Kommentar, die in dem Ereignisverwalter

ist
  1. Warum die Snippet Ursache " Kann nicht erhalten Eigenschaft 'message' auf Null-Objekt "?
  2. Wie kann ich das Setup-Snippet korrekt?
  3. Im Allgemeinen wird / werden nicht ich brauche eine der mockTagLib mockController mockLogging GrailsUnitTestCase Funktionen bei der Verwendung von Spock ?
War es hilfreich?

Lösung

Wenn Sie Einheit testet einen Controller gibt es eine Konvention, die automatisch den Controller für Sie einrichtet. beziehen sich nur auf die controller im Test wie folgt:

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
  }
}

Sie müssen nicht explizit den Controller verspotten, wie ControllerSpec bedeutet es für Sie, aber Sie brauchen, um andere Elemente spotten kann, dass der Controller verwendet. Manchmal genügt es, diese durch die Metaklasse der Steuerung hinzuzufügen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top