我正在尝试使用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失败,都将不胜感激。
答案 0 :(得分:2)
无需存根,您只需正确设置资产路径即可。为了利用0.8.0及更高版本中的Sprockets集成,设置jasmine.yml文件的最佳方法是这样的:
src_dir: app/assets/javascripts
asset_paths:
- lib/assets/javascripts
src_files:
- "**/*"
这将设置Sprockets以查看app/assets/javascripts
和lib/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加载简化了这个过程,所以我推荐一个类似这个的设置。