GWTTestCase调用导致ReferenceError

时间:2012-03-18 14:26:57

标签: gwt junit gwttestcase

案例

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

问题

显然没有为jUnit测试环境加载一个(或多个)脚本。在运行应用程序(开发模式)时一切正常,但是当我尝试运行测试用例时,应用程序(Web服务器以及用户代理)无法加载,并引发以下异常( 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 - 并由类路径成功引用,.gwt.xml文件从GWT继承jUnit(<inherits name="com.google.gwt.junit.JUnit" /> jUnit模块为no在GWT团队指示不再继承的时间更长 - 扩展GWTTestCase将自动继承它。

我使用Raphael-GWT作为单独的模块。此模块也在主模块的.gwt.xml文件中引用,并在所有其他情况下(开发/生产模式)正常运行。

我尝试了什么

  • 简化案例,例如如上所述,剥离测试用例。
  • 验证部署描述符中的继承模块。
  • 改变jUnit的版本,即在V3或V4下运行,并在每次更改时手动编译。
  • 在google上查找,以及在stackoverflow上查找,但没有用。

更多相关信息

Raphael lib用于我为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>                                                                              

1 个答案:

答案 0 :(得分:1)

拉斐尔是怎么装的?可能是js文件永远不会被引入到htmlunit中运行的html页面。

  

引起:com.gargoylesoftware.htmlunit.ScriptException:Wrapped com.gargoylesoftware.htmlunit.ScriptException:ReferenceError:“Raphael”未定义。 (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=2164f4b075bb0ed77f7b008bd113e04831196fec的dracula_graffle.js的副本,第18行是Raphael的第一个引用,它应该在加载raphael js文件时定义,这意味着它不是

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

是否有任何JS文件或脚本标签在html页面加载时运行? GWTTestCases总是只运行一个非常简单的html页面,并且只加载在.gwt.xml文件中实际命名的模块中定义的脚本。是否有任何设置功能作为入口点的一部分运行?您是否尝试过创建一个新的,非常简单的html页面,并为该模块编写一个新的,非常简单的EntryPoint并使用它?在测试这些内容的过程中,我相信您会发现一些不同之处,这些差异对于您的应用程序的工作方式非常重要。

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