Case
我正在尝试为某个类编写一个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);
}
}
依赖关系/上下文信息
.gwt.xml
文件继承了 GWT 的 jUnit(<inherits name="com.google.gwt.junit.JUnit" />
(jUnitGWTTestCase
将自动继承它。
我使用 Raphael-GWT
作为一个单独的模块。 该模块也在主模块的.gwt.xml
文件中引用,并且在所有其他情况下(开发/生产模式(运行良好。
我试过什么
- 简化用例,例如如上所述剥离测试用例。
- 验证部署描述符中的继承模块。
- 改变jUnit的版本,即在V3或V4下运行,并在每次更改时手动编译。
- 在谷歌上查找,以及在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>
拉斐尔是如何加载的?可能是 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,并且由于您的模块以某种方式需要它,应用程序(在本例中为 test(无法加载没有它。我的快速猜测是,这要么是 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页面,并为模块编写一个新的,非常简单的入口点并使用它?在测试这些东西的过程中,我相信你会发现一些差异,这些差异在你的应用程序的工作方式和你的测试工作方式方面很重要。
如果没有...下一个烦人的步骤是再次以手动模式运行,您的应用程序在生产模型中编译(请参阅同一链接,它应该提供有关如何完成此操作的详细信息(。在 Js 中设置 firebug(或任何你喜欢的工具(在异常时停止,或者简单地在第 18 行设置一个断点,当 Raphael 在 dracula_graffle.js 中第一次使用时,以查看加载了哪些脚本,以及为什么 Raphael 尚未定义。