У меня есть метод контроллера как такой:
def search = {
def query = params.query
...
render results as JSON
}
Как делают меня модульный тест это? А именно, как я называю поиск для установки params.query
, и как я тестирую результаты метода render
? Существует ли способ дразнить метод рендеринга, возможно?
Подкласс 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 для интеграционных тестов, если вам нужна полная среда интеграции с базой данных.
TFM : Grails ref chapter 9
Следуйте примеру testCreateWithJSON () ... просто вставьте строку запроса в params ['query'], установите contentType, вызовите search (). Поскольку вы явно вызываете render, самым интересным было бы посмотреть response.contentAsString ...Я бы, вероятно, просто сделал утверждения о сопоставлении с образцом для contentAsString; вы можете повторно проанализировать его как JSON, а затем изучить это дерево объектов, но я подозреваю, что это будет не так ясно / быстро, как простые утверждения о сопоставлении с образцом.
Есть два способа модульного тестирования контроллера, но это потребует от вас некоторых изменений.
Первый - это модульное тестирование самого контроллера, без добавления сложности http парсинга, так что вы напишите свой модульный тест и передадите params.query как часть вашего модульного теста, поэтому разделите вашу функцию поиска на две функции:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
Итак, первая часть тестирует realSearch
.
Затем вторая часть - написать приложение, которое действительно подключится к вашему веб-приложению, и провести функциональный тест, который протестирует все ваше приложение, включая те части контроллера, которые не были протестированы в первой части.