Нет такого свойства: org.codehaus.grails.INCLUDED_JS_LIBRARIES

Требование

Я пытаюсь запустить свои тесты JavaScript в пользовательской фазе тестирования, основанной на фазе функциональной проверки. В основном это необходимо для:

  • Запуск встроенного Tomcat
  • Откройте контроллер
  • Проверьте результат выполненных тестов

Что я сделал

Сначала я создал свой пользовательский этап тестирования, основанный на этом посте. Так выглядит мой _Events.groovy

includeTargets << new File("${basedir}/scripts/_RunJavaScriptUiTests.groovy")

eventConfigureTomcat = { tomcat ->
  tomcat.connector.setAttribute("compression", "on")
  tomcat.connector.setAttribute("compressableMimeType", "text/html,text/xml,text/plain,application/javascript")
  tomcat.connector.port = serverPort
}

eventAllTestsStart = {
  phasesToRun << "uijs"
}

uijsTests = ["uijs"]

uijsTestPhasePreparation = { 
  functionalTestPhasePreparation()
}

uijsTestPhaseCleanUp = { 
  functionalTestPhaseCleanUp()
}
eventTestPhaseEnd = { phase ->
  if( phase == "uijs" ) {
    runJavaScriptUiTests()
  }
}

Затем я решил использовать PhantomJS, чтобы открыть свою страницу и проанализировать выполненные тесты. Поэтому я использовал это в скрипте RunJavaScriptUiTests.groovy

target(runJavaScriptUiTests:"Running Siesta tests") {

    event("StatusUpdate", ["Siesta test phase..."])

    //this is the script that evaluates the result of the tests
    File script = new File("web-app/js/siesta/siesta-phantomjs-runner.js")

    String home = System.getenv("PHANTOMJS_HOME")
    if(!home) {
        throw new RuntimeException("PHANTOMJS_HOME must be set.")
    }

    String executable = "${home}bin${File.separator}phantomjs"
    String port = System.getProperty("server.port","8080")
    String url = "http://localhost:$port/insoft-ext-ui/siesta" //url of my tests

    println "Running Phantomjs ${executable} ${script.absolutePath} "

    try {
        ant.exec(executable: executable, outputproperty: "cmdOut", failonerror: 'true', errorproperty: "cmdErr") {
            arg(value: script.absolutePath)
            arg(value: url)
        }
        }catch(e) {
        println "ERROR: $e"
        throw e
    }

    try {

        String output = "${ant.project.properties.cmdOut}"
        println output

        }catch(e) {
        event("StatusError",["Exception $e"])
    }

}

Я вижу, что функционал FunctionTestPhasePreparation работает, потому что он правильно запускает мое приложение. Я также вижу, что команда phantomjs верна, когда печатает:

Running: /desenv/phantomjs-1.9.2/bin/phantomjs /desenv/java/projetos/insoft-ext-ui/web-app/js/siesta/siesta-phantomjs-runner.js http://localhost:8080/insoft-ext-ui/siesta

Но это дает мне groovy.lang.MissingPropertyException

groovy.lang.MissingPropertyException: No such property: org.codehaus.grails.INCLUDED_JS_LIBRARIES for class: org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:50)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:273)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
    at org.codehaus.groovy.grails.web.filters.JavascriptLibraryFilters$_closure1_closure2_closure3.doCall(JavascriptLibraryFilters.groovy:27)
    at org.codehaus.groovy.grails.web.filters.JavascriptLibraryFilters$_closure1_closure2_closure3.doCall(JavascriptLibraryFilters.groovy)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)

Для полной Stacktrace смотрите здесь.

Интересно, что если я просто сделаю

grails test run-app
phantomjs /desenv/java/projetos/insoft-ext-ui/web-app/js/siesta/siesta-phantomjs-runner.js http://localhost:8080/insoft-ext-ui/siesta

Сценарий работает, и я не получаю никаких исключений.

Вопрос

Почему MissingPropertyException выбрасывается? Я посмотрел на JavascriptLibraryFilters и не нашел причины для этого.

РЕДАКТИРОВАТЬ

О коте

Я использую встроенный Tomcat, который поставляется с Grails, но включаю сжатие в _Events.groovy:

eventConfigureTomcat = { tomcat ->
    tomcat.connector.setAttribute("compression", "on")
    tomcat.connector.setAttribute("compressableMimeType", "text/html,text/xml,text/plain,application/javascript")
    tomcat.connector.port = serverPort
}

1 ответ

У меня нет прямого решения, но я могу помочь вам исследовать это.

Источник вашей проблемы, по-видимому, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper, который применяется в вашей среде Tomcat, что объясняет, почему ваш код работает автономно.

Другие проблемы, относящиеся к этому же классу Spring, существуют в переполнении стека. Большинство из них - проблемы, связанные с неправильной обработкой многочастных запросов. Это заставит меня поверить, что PhantomJS делает многокомпонентные вызовы без соответствующего приведения или интерфейсов для вашей среды. Я подозреваю, что может потребоваться изменение вашей конфигурации Tomcat или Grails.

Вот несколько вопросов SO, на которые я ссылаюсь:

Вот потенциально значимая ошибка в Grails / CXF:

  • Ошибка Spring Security, относящаяся к ошибке CXF, которая говорит: "Чтобы включить MTOM в CXF, вы должны отключить многочастную обработку Grails, установив опцию grails.web.disable.multipart=true в Config.groovy "

Пожалуйста, предоставьте любую информацию, касающуюся ваших настроек Tomcat / Grails, и / или подтвердите, что вы исследовали эти потенциальные проблемы, чтобы мы могли их обесценить.

Надеемся, что этот ответ указывает вам или другим в правильном направлении для правильного решения.

Другие вопросы по тегам