我怎样才能获得所有JS文件的名称

时间:2011-01-18 13:54:46

标签: tapestry

如何获取应用程序的所有JS文件名?

我测试过:

@Inject
private ClientInfrastructure javascriptStack;

void onActivate(){
    mesJavaScripts=javascriptStack.getJavascriptStack();

    for(Asset javascript : mesJavaScripts){
      System.out.println(javascript.toString());
    }
}

但我没有所有的JS。我是否使用优质服务?

由于

2 个答案:

答案 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 而不是行为。始终测试行为