GWTTestCase вызов, вызывающий ReferenceError - PullRequest
0 голосов
/ 18 марта 2012

Case

Я пытаюсь написать GWTTestCase для определенного класса, используемого в качестве докладчика для компонента панели инструментов просмотра истории, который я создаю.

Проблема

один (или несколько) сценариев, очевидно, не загружаются для среды тестирования jUnit.все работает нормально при запуске приложения (режим разработки), но когда я пытаюсь запустить тестовый пример, приложение (веб-сервер, а также пользовательский агент) не загружается, и возникает следующее исключение ( stacktrace сокращаетсядля простоты ):

com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: Exception invoking jsxFunction_write  at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:601)   at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537)    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538)  at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499)     at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:595)   ... 41 more

...

Caused by: com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: "Raphael" is not defined. (http://192.168.10.32:3692/com.gigaspaces.admin.webui.Gs_webui.JUnit/dracula/dracula_graffle.js#18) (http://192.168.10.32:3692/com.gigaspaces.admin.webui.Gs_webui.JUnit/com.gigaspaces.admin.webui.Gs_webui.JUnit.nocache.js#16)    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:601)

Соответствующие источники

Вот (смехотворно просто) GWTTestCase используется:

public class HistoryBrowserTest extends GWTTestCase {

    @Override
    public String getModuleName() {
        return "com.gigaspaces.admin.webui.Gs_webui";
    }

    public void testHistoryBrowser() {
        assertTrue(true);
    }
}

Зависимости / контекстная информация

jUnit 4.10 используется в качестве внешнего jar - и на него успешно ссылается classpath, а файл .gwt.xml наследует jUnit от GWT (<inherits name="com.google.gwt.junit.JUnit" />) , так как модуль jUnit больше не наследуется каккоманда GWT дает указание не делать этого - расширение GWTTestCase наследует его автоматически.

Я использую Raphael-GWT в качестве отдельного модуля.на этот модуль также есть ссылка в файле .gwt.xml основного модуля, и он работает нормально при любых других обстоятельствах (режим разработки / производства).

Что я пробовал

  • , упрощая случайНапример, вычеркнуть тестовый пример, как показано выше.
  • проверка унаследованных модулей в дескрипторах развертывания.
  • изменяющаяся версия jUnit, т. е. работающая как под V3 или V4, так и скомпилированная вручную при каждом изменении.
  • посмотрел на google, а также здесь на stackoverflow, но безрезультатно.

Более актуальная информация

Raphael lib используется для GWTОболочка, которую я написал для Dracula (библиотека визуализации графов JS), поэтому dracula_graffle.js происходит там.вложенный .gwt.xml файл источника для справки:

<module rename-to="gs_webui">

    <inherits name="com.google.gwt.user.User" />

    <!-- Other module inherits -->
    <inherits name="com.extjs.gxt.ui.GXT" />
    <inherits name="org.highchartsgwt.HighCharts" />
    <inherits name="gwtupload.GWTUpload" />
    <inherits name="com.hydro4ge.raphaelgwt.RaphaelGWT" />
    <inherits name="com.gigaspaces.gauge.Gs_gauges" />
    <inherits name="com.gigaspaces.graphs.Gs_graphs" />
    <inherits name="com.gigaspaces.svgcomponents.Gs_svg_components" />
    <inherits name="com.javaconstructors.colorpalette.Color_palette" />
    <inherits name="com.gigaspaces.jquerywidgets.Gs_jquery_widgets" />
    <inherits name="com.gigaspaces.codemirror_gwt.CodeMirror_GWT"/>

    <inherits name="com.google.gwt.i18n.I18N"/>
    <inherits name="com.google.gwt.query.Query" />

    <!-- I18N stuff, log configurations, and so forth... -->

    <entry-point class="com.gigaspaces.admin.webui.client.Gs_webui" />

    <!-- further source folder inherits... -->

</module>                                                                              

1 Ответ

1 голос
/ 18 марта 2012

Как загружается Рафаэль?Возможно, файл js никогда не загружается на html-страницу, запускаемую в htmlunit.

Причина: com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException:ReferenceError: «Рафаэль» не определен.(http://192.168.10.32:3692/com.gigaspaces.admin.webui.Gs_webui.JUnit/dracula/dracula_graffle.js#18) (http://192.168.10.32:3692/com.gigaspaces.admin.webui.Gs_webui.JUnit/com.gigaspaces.admin.webui.Gs_webui.JUnit.nocache.js#16)

Этот файл, по-видимому, не используется RaphaelGWT, поскольку он не указан в файле модуля (см. Здесь http://code.google.com/p/raphaelgwt/source/browse/trunk/src/com/hydro4ge/raphaelgwt/RaphaelGWT.gwt.xml).

Похоже, что это источник вашей ошибки - dracula_graffle.js (либо строка 18, либо загруженный 18-й файл) не может найти символ Raphael, и поскольку это как-то требуется вашему модулю, приложению (в данном случае test)не могу загрузить без него. Мое быстрое предположение, что это либо проблема HtmlUnit (HtmlUnit - это то, во что запускаются тестовые примеры gwt, и имитирует только реальный браузер) - вы можете попробовать запустить этот же тест в реальном браузере,http://code.google.com/webtoolkit/doc/latest/DevGuideTesting.html#Manual_Mode для получения дополнительной информации. Если это не удается, то, возможно, ваше приложение обычно загружается на html-страницу, где некоторые файлы JS уже были загружены, поэтому этого не происходит - их необходимо загружать и при тестировании приложения,либо используя ScriptInjector в методе установки, либо добавив их в файл модуля.


(После редактирования комментариев)

Поскольку ошибка возникла и в ручном режиме, tздесь не ошибка с htmlunit, а с зависимостями в вашем коде.Из того, что кажется копией dracula_graffle.js в http://code.google.com/p/synoptic/source/browse/synopticgwt/war/dracula_graffle.js?spec=svn2164f4b075bb0ed77f7b008bd113e04831196fec&r=2164f4b075bb0ed77f7b008bd113e04831196fec,, строка 18 является первой ссылкой на Raphael, которая должна была определить, когда был загружен файл Raphael JS, что подразумевает, что это не так.

Работа в ручном режиме с Firebug или чем-то подобным должна показать вам ошибку в консоли.Исходя из этого, я думаю, можно с уверенностью сказать, что в тестовом примере что-то отличается от стандартной точки входа + html-страница.Вопрос в том, что отличается.

Существуют ли какие-либо JS-файлы или теги сценариев, которые запускаются при загрузке html-страницы?GWTTestCases всегда запускаются с очень простой HTML-страницей и загружают только те скрипты, которые определены в модуле, который вы на самом деле называете в файле .gwt.xml.Существуют ли какие-либо функции настройки, которые выполняются как часть точки входа?Вы пытались создать новую, очень простую HTML-страницу и написать новую, очень простую EntryPoint для модуля и использовать ее вместо этого?Я полагаю, что в ходе тестирования этих вещей вы обнаружите некоторое различие, которое важно в том, как ваше приложение работает, и в том, как работает ваш тест.

Если нет ... следующий раздражающий шаг - запуститьснова в ручном режиме, с вашим приложением, скомпилированным в производственную модель (см. ту же ссылку, в нем должно быть подробно описано, как это можно сделать).Установите firebug (или любой другой инструмент, который вы предпочитаете), чтобы останавливаться на исключениях в Js, или просто установите точку останова в строке 18, когда Raphael впервые используется в dracula_graffle.js, чтобы увидеть, какие скрипты имеют загружены,и почему Рафаэль еще не определен.

...