Почему этот метод возвращает значение null, даже если базовый контроллер имитируется с помощью Mock() Спокса?

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

обратите внимание на закомментированный метод, который находится в EventController

  1. Почему во фрагменте возникает сообщение «Не удается получить сообщение о свойстве для пустого объекта»?
  2. Как правильно настроить сниппет?
  3. Как правило, мне не понадобятся/потребуются какие-либо функции mockTagLib, mockController, mockLogging GrailsUnitTestCase при использовании Spock ?

person user569825    schedule 12.01.2011    source источник


Ответы (1)


Если вы проводите модульное тестирование контроллера, существует соглашение, которое автоматически настраивает контроллер для вас. Просто обратитесь к controller в своем тесте следующим образом;

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

Вам не нужно явно имитировать контроллер, поскольку ControllerSpec делает это за вас, однако вам может понадобиться имитировать другие элементы, которые использует ваш контроллер. Иногда достаточно добавить их через метакласс контроллера.

person mfloryan    schedule 12.01.2011
comment
Здорово! Спасибо, мфлорян. Что в данном контексте (?) является метаклассом контроллеров? - person user569825; 13.01.2011
comment
Для пользователей более поздних версий Grails (2.3.x) эта проблема, по-видимому, возникла снова, поскольку Spock по умолчанию является частью тестов Grails. jira.grails.org/browse/GRAILS-11239 - person jonnybot; 20.03.2014