Модульное тестирование метода контроллера? - PullRequest
6 голосов
/ 17 мая 2010

У меня есть такой метод контроллера:

def search = {
    def query = params.query

            ...

    render results as JSON
}

Как мне это проверить? В частности, как мне вызвать search для установки params.query и как проверить результаты метода render? Возможно, есть способ издеваться над методом рендера?

Ответы [ 3 ]

5 голосов
/ 17 мая 2010

Подкласс grails.test.ControllerUnitTestCase для ваших модульных тестов. Grails автоматически создаст экземпляр вашего контроллера и смоделирует версии рендера и перенаправления, которые позволят вам легко проверить результаты. Просто назначьте тестовые входы для controller.params, чтобы настроить тест.

Пример:

class SomethingController {
    def search = {
        def query = params.query
        ...stuff...
        render results as JSON
    }
}

Тест выглядит так:

class SomethingControllerTests extends grails.test.ControllerUnitTestCase {
    void testSearch() {
        controller.params.query = "test query"
        controller.search()
        assertEquals "expected result", controller.response.contentAsString
    }
}

Примечание: вы можете использовать ControllerUnitTestCase и для интеграционных тестов, если вам нужна полная среда интеграции с базой данных.

0 голосов
/ 17 мая 2010

TFM : Grails по главе 9

Следуйте примеру testCreateWithJSON () ... просто вставьте строку запроса в params ['query'], установите contentType, вызовите search (). Так как вы явно вызываете рендер, самой простой вещью было бы посмотреть на response.contentAsString ... Я бы, вероятно, просто сделал утверждения о сопоставлении с образцом для contentAsString; Вы могли бы повторно проанализировать его как JSON, а затем исследовать это дерево объектов, но я подозреваю, что оно не будет таким же ясным / быстрым, как простые утверждения соответствия шаблону.

0 голосов
/ 17 мая 2010

Существует два способа модульного тестирования контроллера, но это потребует некоторых изменений для вас.

Первое - это модульное тестирование самого контроллера, не добавляя сложности синтаксического анализа http, поэтому вы должны написать свой тестовый модуль и передать в качестве параметра своего модульного теста params.query, поэтому разделите свою функцию поиска на две части. функции:

def search = {
  def query = params.query
  render realSearch(query) as JSON
}

def realSearch ...

Итак, первая часть тестов realSearch.

Затем вторая часть состоит в том, чтобы написать приложение, которое будет фактически подключаться к вашему веб-приложению, и провести функциональный тест, который проверит все ваше приложение, включая части контроллера, которые не были протестированы в первой части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...