在Jasmine测试运行期间找不到haml-js模板

时间:2011-12-02 23:32:03

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

我正在尝试使用Jasmine测试一些backbone.js视图(通过jasmine-headless-webkit)。除了我的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失败,都将不胜感激。

1 个答案:

答案 0 :(得分:2)

无需存根,您只需正确设置资产路径即可。为了利用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宝石时该怎么做,你就可以摆脱你自己的jQuery和Backbone副本,你也可以使用.hamljs个模板。此时,您应该使用Bundler:

运行
bundle exec jasmine-headless-webkit

最后,确保所有内容实际加载的最佳方法是使用list选项:

bundle exec jasmine-headless-webkit -l

这将通过JHW和Sprockets的文件加载器运行所有内容,并打印出要包含的文件的顺序。这将有助于诊断require问题,因为您始终必须在单个场景中处理Jasmine样式和Sprockets样式的加载。设置你的src文件完全通过Sprockets加载简化了这个过程,所以我推荐一个类似这个的设置。