0

案子

我正在尝试GWTTestCase为某个类编写一个,用作我正在构建的历史浏览工具栏组件的演示者。

问题

一个(或多个)脚本显然没有为 jUnit 测试环境加载。运行应用程序(开发模式)时一切正常,但是当我尝试运行测试用例时,应用程序(Web 服务器和用户代理)无法加载,并引发以下异常(为简单起见缩短了堆栈跟踪) :

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 - 并被类路径成功引用,并且.gwt.xml文件从 GWT ( <inherits name="com.google.gwt.junit.JUnit" />)继承 jUnitjUnit 模块不再像 GWT 团队指示的那样被继承 - 扩展GWTTestCase将自动继承它。

Raphael-GWT作为一个单独的模块使用。该模块也在主模块的.gwt.xml文件中被引用,并且在所有其他情况下(开发/生产模式)运行良好。

我试过什么

  • 简化案例,例如如上所示剥离测试案例。
  • 验证部署描述符中的继承模块。
  • 不同的 jUnit 版本,即在 V3 或 V4 下运行,并在每次更改时手动编译。
  • 在谷歌上查找,以及在stackoverflow上查找,均无济于事。

更多相关信息

Raphaellib 被用于我为 Dracula(一个 JS 图形可视化库)编写的 GWT 包装器,因此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>                                                                              
4

1 回答 1

1

拉斐尔是如何加载的?可能是 js 文件永远不会被拉入在 htmlunit 中运行的 html 页面。

引起: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)

这个文件似乎没有被 RaphaelGWT 使用,因为它没有在他们的模块文件中列出(见这里http://code.google.com/p/raphaelgwt/source/browse/trunk/src/com/hydro4ge/ raphaelgwt/RaphaelGWT.gwt.xml)。

这似乎是您的错误的来源- dracula_graffle.js(第 18 行,或者这是加载的第 18 个文件)找不到符号 Raphael,并且由于您的模块以某种方式需要它,因此应用程序(在本例中为测试)不能没有它加载。我的快速猜测是它要么是 HtmlUnit 问题(HtmlUnit 是 gwt 测试用例在其中运行的,并且只模拟真实的浏览器) - 您可以尝试在真实的浏览器中运行相同的测试,请参阅http://code.google .com/webtoolkit/doc/latest/DevGuideTesting.html#Manual_Mode了解更多信息。如果失败,那么您的应用程序通常会加载到已经加载了一些 JS 文件的 html 页面中,因此不会发生这种情况 - 在测试应用程序时也需要加载这些文件,或者在设置方法中使用 ScriptInjector,或者通过将它们添加到您的模块文件中。


(修改后,评论)

由于错误也发生在手动模式下,因此 htmlunit 没有错误,但代码中存在依赖项。从似乎是http://code.google.com/p/synoptic/source/browse/synopticgwt/war/dracula_graffle.js?spec=svn2164f4b075bb0ed77f7b008bd113e04831196fec&r=2164f4b075bb0ed77f7181808bd113e的dracula_graffle.js的副本中to Raphael,它应该在加载 raphael js 文件时定义,这意味着它不是。

在手动模式下运行 Firebug 或类似的运行应该会在控制台中显示错误。基于此,我认为可以肯定地说测试用例与标准入口点 + html 页面有所不同。问题是,有什么不同。

加载 html 页面时是否有任何 JS 文件或脚本标签运行?GWTTestCases 始终只运行一个非常简单的 html 页面,并且只加载在您的 .gwt.xml 文件中实际命名的模块中定义的脚本。是否有任何设置功能作为入口点的一部分运行?您是否尝试过制作一个新的、非常简单的 html 页面,并为该模块编写一个新的、非常简单的 EntryPoint 并改用它?在测试这些东西的过程中,我相信你会发现你的应用程序工作方式与测试工作方式的一些重要区别。

如果没有...下一个烦人的步骤是再次以手动模式运行,并在生产模型中编译您的应用程序(参见相同的链接,它应该提供有关如何完成的详细信息)。在 dracula_graffle.js 中第一次使用 Raphael 时,设置 firebug(或您喜欢的任何工具)以停止 Js 中的异常,或者简单地在第 18 行设置断点,以查看加载了哪些脚本,以及为什么 Raphael没有尚未定义。

于 2012-03-18T15:23:00.783 回答