【问题标题】:Can't find haml-js templates during Jasmine test run在 Jasmine 测试运行期间找不到 haml-js 模板
【发布时间】:2011-12-02 23:32:03
【问题描述】:

我正在尝试使用 Jasmine(通过 jasmine-headless-webkit)测试一些主干.js 视图。一切都运行良好,除了我的 haml-js 模板在测试中无法访问。

我认为以下代码可以正常工作:

render: =>
  html = JST['views/avia_view_template']()
  $(@el).html(html)

...但是当它作为 Jasmine 规范的一部分运行时,出现以下故障:

ReferenceError: Can't find variable: JST in /home/duncan/avia/app/assets/javascripts/views/avia_view.js.coffee

我怀疑我在 jasmine.yml 中做错了什么。我已经明确包含了它仍然失败的模板文件:

src_files:
  - "vendor/**/*.{js,coffee}"
  - "lib/**/*.{js,coffee}"
  - app/assets/javascripts/application.js
  - app/assets/javascripts/avia.js
  - app/assets/javascripts/jquery-1.6.4.js
  - app/assets/javascripts/underscore.js
  - app/assets/javascripts/backbone.js
  - app/assets/javascripts/jquery.jqGrid.min.js
  - app/assets/javascripts/views/avia_view_template.jst.hamljs
  - app/assets/javascripts/views/avia_view.js.coffee

也许我只是在这里采取了错误的方法......我应该使用 Jasmine 来存根和模拟对 JST 和 jQuery 的调用吗?严格的单元测试方法说我应该这样做,在这种情况下,缺少模板访问不是问题。

任何提示 - 无论是关于我的测试方法,还是具体的 JST 失败,都将不胜感激。

【问题讨论】:

    标签: javascript ruby-on-rails-3.1 backbone.js haml jasmine


    【解决方案1】:

    无需存根,您只需正确设置资产路径。为了利用 0.8.0 及更高版本中的 Sprockets 集成,设置 jasmine.yml 文件的最佳方法如下:

    src_dir: app/assets/javascripts
    asset_paths:
    - lib/assets/javascripts
    src_files:
    - "**/*"
    

    这将设置 Sprockets 在 app/assets/javascriptslib/assets/javascripts 中查找,并告诉 jasmine-headless-webkit 提取两个目录中的所有可能文件。在这种情况下,不会使用 Jasmine 的正常文件需求,而是使用 Sprockets。

    然后,像通常在 JS 文件中一样设置您的 require 语句。所以在'application.js.coffee'中:

    #= require jquery-1.6.4
    #= require avia
    #= require underscore
    #= require backbone
    #= require jquery.jqGrid.min
    #= require_tree .
    
    alert "Look, Internet codes!"
    

    avia_view.js.coffee:

    #= require views/avia_view_template.jst.hamljs
    
    class window.AviaView extends Backbone.View
      template: JST['views/avia_view_template']
      ... code ...
    

    当然,除非加载了支持 Sprockets 的 Haml 处理器,否则不会加载那些 .hamljs 模板。所以你会想要一个 Gemfile,其中至少有这个:

    gem 'jasmine-headless-webkit'
    gem 'haml-sprockets'
    # also bring in backbone and jquery
    gem 'jquery-rails'
    gem 'backbone-rails'
    

    然后,如果您的应用程序本身知道在加载这些供应商的 JS gem 时要做什么,您可以摆脱自己的 jQuery 和 Backbone 副本,并且您还可以使用 .hamljs 模板。此时,您应该使用 Bundler 运行:

    bundle exec jasmine-headless-webkit
    

    最后,确保所有内容都真正加载的最佳方法是使用列表选项:

    bundle exec jasmine-headless-webkit -l
    

    这将通过 JHW 和 Sprockets 的文件加载器运行所有内容,并打印出要包含的文件的顺序。这将有助于诊断require 问题,因为您总是必须在一个场景中同时处理 Jasmine 样式和 Sprockets 样式的加载。将您的 src 文件设置为完全通过 Sprockets 加载可以大大简化该过程,因此我建议您进行类似这样的设置。

    【讨论】:

    • 非常感谢 - 效果很好。但对于遵循这些说明的任何人,只有一个警告:asset_paths 设置是在三天前在撰写本文时添加的,因此请确保您使用的是最新鲜的 jasmine-headless-webkit 代码。我不是,我在桌子上敲了一会儿头,直到我弄明白了。
    猜你喜欢
    • 2021-02-15
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 2012-07-28
    • 1970-01-01
    • 2023-03-30
    • 2018-12-06
    相关资源
    最近更新 更多