我正在尝试为某个类编写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 - 并由类路径成功引用, jUnit模块为no在GWT团队指示不再继承的时间更长 - 扩展.gwt.xml
文件从GWT继承jUnit(<inherits name="com.google.gwt.junit.JUnit" />
)GWTTestCase
将自动继承它。
我使用Raphael-GWT
作为单独的模块。此模块也在主模块的.gwt.xml
文件中引用,并在所有其他情况下(开发/生产模式)正常运行。
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>
答案 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来查看有加载的脚本时,以及拉斐尔尚未定义的原因。