На техническом уровне необходимо решить, использовать ли интеграцию или блок тест.
В модульных тестах Grails внедрение зависимостей (например, служб) недоступно (однако тестовый класс может предоставить контроллеру зависимости вручную). Другие типы инструментов, включая доступ к базе данных, также недоступны.
По моему личному мнению, лучше написать более детальные (модульные) тесты с контроллерами; однако, если вы не хотите издеваться над вашими службами, тесты интеграции тоже подойдут.
Следующий пример кода является интеграционным тестом (но модульный тест не отличается от , что отличается):
class BinaryOutputControllerTests extends GroovyTestCase {
void testExportToExcel() {
def controller = new BinaryOutputController()
controller.session.playerID = "somePlayerID"
controller.params.format = "xls"
controller.params.extension = "xls"
def model = controller.export()
assert controller.response.status == 200
assert controller.response.contentAsByteArray.size() == 167336
assert controller.response.getContentType() \
== "application/vnd.ms-excel"
assert controller.response.getHeader("Content-disposition") \
== "attachment; filename=tune.${controller.params.extension}"
assert model.tuneInstanceList.size()
assert controller.session.valueNames.size() == 0
}
}
Пример кода показывает, что вы можете получить доступ к GrailsHttpSession и объекту контроллера params
для инициализации значений.
Далее вы должны вызвать метод действия контроллера и получить его возвращаемые значения.
При тестировании утверждений вы можете получить доступ к MockHttpServletResponse контроллера для запроса значений ответов. Опять же, доступен объект GrailsHttpSession , а также модель , возвращаемая методом действия контроллера .
Очевидно, вам необходимо определить варианты использования; Тем не менее, это некоторые технические основы. Вы также должны написать неудачные тесты, используя закрытие shouldFail { ... }
. И посмотрите на предоставленные мной ссылки, так как они подсказывают вам дополнительные опции.
РЕДАКТИРОВАТЬ: Согласно вашему дальнейшему запросу:
Во-первых, пусть ваш ExporterNotFoundException
extend RuntimeException
(не проверенный Exception
), чтобы избежать этого UndeclaredThrowableException
. В качестве альтернативы (не рекомендуется) добавьте предложение throws ExporterNotFoundException
в определение метода DefaultExporterFactory.createExporter(..)
. - Все в Groovy основано на RuntimeException
с, но вам все равно нужно явно объявить флажок Exception
с использованием предложения throws
.
Во-вторых, проверьте, способен ли ваш ExportService
обработать "xls" format
(найдите причину этого ExporterNotFoundException
). Видимо, это не так.