Модульное тестирование Grails: ошибка при перенаправлении на действие другого контроллера

У меня есть действие контроллера, которое выглядит так

//An action inside itemUserController
def commentItem() {
    String comment = params['itemComment']
    User user = session['currentUser']
    String title = params['title']
    def isBook =  false, isTVShow = false, isMovie = false

    //I do some manips here......
    //and finally...
      if(isBook)
          redirect(controller: "book", action: "show", id: book.id)
      if(isMovie)
         redirect(controller: "movie", action: "show", id: movie.id)
      if(isTVShow)
         redirect(controller: "TVShow", action: "show", id: tvShow.id)
}

Моя проблема заключается в тестировании этого, опробованного в модульных тестах, а также в интеграции, но у меня такая же ошибка «NullPointerException» в строках, содержащих перенаправление (похоже, что контроллеры книги, фильма и TVShow внутри перенаправления равны нулю, и я понятия не имею, как введите их, поскольку они не являются полями в классе контроллера).

java.lang.NullPointerException
at ivvq.ItemUserController.$tt__commentItem(ItemUserController.groovy:138)

Вот моя часть кода в тестовом классе:

when: "User tries to comment an item with an empty comment title and an empty comment text"
    itemUserController.session['currentUser'] = user;
    itemUserController.params['itemComment'] = ""
    itemUserController.params['title'] = ""
    itemUserController.params['itemBookId'] = book.id
    itemUserController.commentItem()

    then: "The user has an error message and the comment isnt posted"
    itemUserController.flash.error != ""

Вкратце, то, что я собираюсь сделать, это позволить пользователю комментировать элемент и отображать тот же элемент, прокомментированный после отправки комментария.

NB: я использую Grails 2.3.11


person Berchmans    schedule 03.11.2015    source источник


Ответы (1)


Я сталкивался с подобными ситуациями и в итоге изменил свой стиль перенаправления. Теперь я использую что-то вроде этого:

redirect(uri: "/controller/action", params: redirectParams)

Для вашей ситуации перенаправление будет выглядеть так:

redirect(uri: "/book/show", params: [id: book.id])

Примечание. Я не проверял это, но это должно быть довольно близко. params — это просто карта параметров для отправки в следующий метод. Тогда это сработало для меня во всех моих модульных тестах.

Документация по стилям перенаправления находится здесь, если это полезно.

person mnd    schedule 03.11.2015