Нет такого свойства: 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, на которые я ссылаюсь:
- SO: загрузка файлов выдает Нет сигнатуры исключения метода (в методе getFile())
- SO: загрузка файла в Grails
- SO: связь между подписанным апплетом и контроллером на стороне сервера
- SO: java.lang.IllegalStateException: стандартный тип аргумента [org.springframework.web.multipart.MultipartHttpServletRequest]
Вот потенциально значимая ошибка в Grails / CXF:
- Ошибка Spring Security, относящаяся к ошибке CXF, которая говорит: "Чтобы включить MTOM в CXF, вы должны отключить многочастную обработку Grails, установив опцию
grails.web.disable.multipart=true
вConfig.groovy
"
Пожалуйста, предоставьте любую информацию, касающуюся ваших настроек Tomcat / Grails, и / или подтвердите, что вы исследовали эти потенциальные проблемы, чтобы мы могли их обесценить.
Надеемся, что этот ответ указывает вам или другим в правильном направлении для правильного решения.