Warum kehrt diese Methode null, obwohl die zugrundeliegenden Controller verspottet wird mit Spocks' Mock ()?
-
10-10-2019 - |
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- Warum die Snippet Ursache " Kann nicht erhalten Eigenschaft 'message' auf Null-Objekt "?
- Wie kann ich das Setup-Snippet korrekt?
- Im Allgemeinen wird / werden nicht ich brauche eine der mockTagLib mockController mockLogging GrailsUnitTestCase Funktionen bei der Verwendung von Spock ?
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