Тест-кейс для экспорта в Excel - PullRequest
0 голосов
/ 01 ноября 2010

У меня есть экспорт в функциональность Excel в моем приложении. Я должен написать контрольный пример для того же самого.

Любые входы ?? Пример кода ??

Вот мой код действия.

Когда пользователь нажимает «Загрузить в Excel» на странице, вызывается действие экспорта ниже. Я должен проверить эту функциональность.

def export={

    def playerId=session["playerId"]

    //Calls calculateId, runs an sql query and returns a List
    tuneInstanceList = tuneService.calculateId(playerId)

    if(params?.format && params.format != "html"){
        response.contentType =     ConfigurationHolder.config.grails.mime.types[params.format]
        response.setHeader("Content-disposition", "attachment; filename=tune.${params.extension}")


        exportService.export(params.format, response.outputStream, tuneInstanceList,[:], [:])
    }

    [tuneInstanceList: tuneInstanceList]

    session.flush()
    session.clear()
}

Отредактировано:

В соответствии с ответом Роббертса написал интеграционный тест, как показано ниже.

    class BinaryOutputControllerTests extends GroovyTestCase { 
    void testExportToExcel() { 
    def controller = new TuneController() 

    controller.session.playerID = "ABG65" 
    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 
} 

}

Однако я получаю следующую ошибку. Мысли?

TuneController.groovy: 169 относится к строке в действии экспорта, а именно.

exportService.export(params.format, response.outputStream, tuneInstanceList,[:], [:])

TuneControllerTests.groovy: 264 относится к строке в тестах, написанных, а именно.

def model = tuneController.export()

Ниже приведена ошибка, которую я получаю.

java.lang.reflect.UndeclaredThrowableException
at de.andreasschmitt.export.ExportService$$EnhancerByCGLIB$$cbf864b.export()
at de.andreasschmitt.export.ExportService$export.call(Unknown Source)
at pride.TuneController$_closure5.doCall(TuneController.groovy:169)
at pride.TuneController$_closure5.doCall(TuneController.groovy)
at pride.TuneControllerTests.testExportToExcel(TuneControllerTests.groovy:264)
Caused by: de.andreasschmitt.export.exporter.ExporterNotFoundException: No exporter     found for type: xls
at de.andreasschmitt.export.exporter.DefaultExporterFactory.createExporter    (DefaultExporterFactory.groovy:56)
at de.andreasschmitt.export.exporter.ExporterFactory$createExporter$0.callCurrent    (Unknown Source)
at de.andreasschmitt.export.exporter.DefaultExporterFactory.createExporter    (DefaultExporterFactory.groovy:23)
at de.andreasschmitt.export.exporter.ExporterFactory$createExporter.call(Unknown     Source)
at de.andreasschmitt.export.ExportService.export(ExportService.groovy:19)
at de.andreasschmitt.export.ExportService$$FastClassByCGLIB$$c1bbbb10.invoke()
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at de.andreasschmitt.export.ExportService$$EnhancerByCGLIB$$cbf864b.export()
at de.andreasschmitt.export.ExportService$export.call(Unknown Source)
at pride.TuneController$_closure5.doCall(TuneController.groovy:169)
at pride.TuneController$_closure5.doCall(TuneController.groovy)
at pride.TuneControllerTests.testExportToExcel(TuneControllerTests.groovy:264)
at _GrailsTest_groovy$_run_closure4.doCall(_GrailsTest_groovy:268)
at _GrailsTest_groovy$_run_closure4.call(_GrailsTest_groovy)
at _GrailsTest_groovy$_run_closure2.doCall(_GrailsTest_groovy:225)
at _GrailsTest_groovy$_run_closure1_closure21.doCall(_GrailsTest_groovy:184)
at _GrailsTest_groovy$_run_closure1.doCall(_GrailsTest_groovy:171)
at TestApp$_run_closure1.doCall(TestApp.groovy:101)
at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
at gant.Gant.withBuildListeners(Gant.groovy:427)
at gant.Gant.this$2$withBuildListeners(Gant.groovy)
at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
at gant.Gant.dispatch(Gant.groovy:415)
at gant.Gant.this$2$dispatch(Gant.groovy)
at gant.Gant.invokeMethod(Gant.groovy)
at gant.Gant.executeTargets(Gant.groovy:590)
at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No     bean     named 'xlsExporter' is defined
at de.andreasschmitt.export.exporter.DefaultExporterFactory.createExporter            (DefaultExporterFactory.groovy:34)

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

На техническом уровне необходимо решить, использовать ли интеграцию или блок тест.

В модульных тестах 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). Видимо, это не так.

0 голосов
/ 01 ноября 2010

На что намекает Велисарий, так это на то, что мы не можем предоставить то, что вы ищете.Для тестовых случаев (или вы имеете в виду тестовые данные?) Вам действительно следует рассмотреть варианты использования системы.Варианты использования должны быть известны до кодирования (то есть, как мои пользователи будут использовать это приложение).Вы или кто-то из вашей команды должны знать, как это должно работать, и должны помочь вам найти то, что вы ищете.Если вы или член команды не знаете, как это должно работать, найдите того, кто это сделает;мы (широкая публика) не можем помочь.

Как только вы знаете, как это должно работать, вы сможете найти / обработать образцы данных для работы.

...