如何获取应用程序的所有JS文件名?
我测试过:
@Inject
private ClientInfrastructure javascriptStack;
void onActivate(){
mesJavaScripts=javascriptStack.getJavascriptStack();
for(Asset javascript : mesJavaScripts){
System.out.println(javascript.toString());
}
}
但我没有所有的JS。我是否使用优质服务?
由于
答案 0 :(得分:1)
这种方式似乎有效,虽然它依赖于一些可能会改变的内部结构,但可能会使事情变慢。根据您的需要,您可能希望根据您关注的页面中设置的请求参数对其进行过滤(将RequestGlobals添加为参数并使用set / getAttribute)。
更好的方法是提供自己的DocumentLinker,以便在添加脚本时捕获脚本。
将此添加到您的AppModule:
public void contributeMarkupRenderer(OrderedConfiguration<MarkupRendererFilter> configuration, final Environment environment, final RequestGlobals request) {
MarkupRendererFilter getScripts = new MarkupRendererFilter() {
public void renderMarkup(MarkupWriter writer, MarkupRenderer renderer) {
DocumentLinker dl = environment.peek(DocumentLinker.class);
renderer.renderMarkup(writer);
try {
List<String> scripts = (List<String>)request.getAttribute("scripts");
if (scripts != null) {
scripts.clear();
Field f = dl.getClass().getDeclaredField("scripts");
f.setAccessible(true);
scripts.addAll((List<String>)f.get(dl));
}
} catch (Exception e) {}
}
};
configuration.add("getScripts", getScripts, "after:DefaultValidationDecorator");
}
在你的测试中:
request.setAttribute("scripts", new ArrayList<String>());
执行页面
assert request.getAttribute("scripts").contains(path_to_script_you_want_to_check);
您可能需要更改任何一方以去除Tapestry添加的额外路径信息。
答案 1 :(得分:1)
我仍然不遵循这里的需要;是否有必要的JS文件包含在响应中的问题是集成测试问题;您可以使用PageTester(通过遍历返回的DOM)或Selenium(再次通过遍历客户端DOM)来确定这一点。
事实上,理想情况下(这很难)你可以在Selenium编写测试,只有在必要的JS到位时才能通过。
鉴于Tapestry将在生产模式下将您的脚本聚合到JS堆栈中(并且可能在5.3中以某种方式改变),您正在测试 state 而不是行为。始终测试行为。