0

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

4

1 回答 1

2

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

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

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

require然后,像通常在 JS 文件中一样设置语句。所以在“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 ...

当然,.hamljs除非加载了支持 Sprockets 的 Haml 处理器,否则不会加载这些模板。所以你会想要一个 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

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

bundle exec jasmine-headless-webkit -l

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

于 2011-12-05T13:54:49.400 回答