2

我正在使用sht_rails gem 在我的 Rails 3.2/Backbone 应用程序中呈现车把模板。

我希望在应用程序的主干和导轨部分都使用这个 .handlebars 模板,但到目前为止,我只是让它在主干中工作。

我这样使用它:

class MyApp.views.MyView extends MyApp.views.BaseView

  template: SHT['templates/feed_item']

  render: ->
    data = {}
    @$el.html @template(data)
    @

这在应用程序中效果很好,完全没有问题,我的车把模板看起来很可爱。

但是,这对我的 js 测试没有好处(我使用 Jasmine 和 jasmine-headless-webkit)

这就是发生的事情:

$ jasmine-headless-webkit
ReferenceError: Can't find variable: SHT

这是完全有道理的,因为似乎 sht_rails gem 注册了 SHT 变量,但是,在我测试时它似乎并没有这样做。

运行 jhw 时是否有注册 SHT 变量的好方法?还是茉莉花本身?我什至不需要模板来为我的测试渲染,只要知道模板被调用就足够了。但是现在,我所有的茉莉花测试都被打破了,直到我弄清楚如何注册这个 SHT。

谢谢!

4

1 回答 1

1

在我们的 Rails 3.2/Backbone/Marionette 应用程序中通过tilt-jade gem 使用jade 模板时,我们遇到了同样的问题(因此下面的代码示例中的变量)。我们的解决方案是创建一个模板抽象,然后在规范执行期间使用 Jasmine 间谍来伪造响应。这种方法还允许我们测试模板的使用、构造等。JST

一般间谍

如果您不熟悉 Jasmine间谍

Jasmine 集成了允许许多间谍、嘲笑和伪装行为的“间谍”。“间谍”取代了它正在监视的功能。

抽象

创建抽象:

YourApp.tpl = function(key, data) {
  var path = "templates";
  path += key.charAt(0) === "/" ? key : "/" + key;

  var templateFn = JST[path];
  if(!templateFn) {
    throw new Error('Template "' + path + '" not found');
  }
  if(typeof templateFn !== "function") {
    throw new Error('Template "' + path + '" was a ' + typeof(templateFn) + '. Type "function" expected');
  }
  return templateFn(data);
};

和必要的猴子补丁:

// MONKEYPATCH - Overriding Renderer to use YourApp template function
Marionette.Renderer = {
  render: function(template, model){
    return YourApp.tpl(template, model);
  }
};

模板抽象间谍 (spec_helper.js)

现在我们可以进行如下间谍活动:

spyOn(YourApp, 'tpl').andCallFake(function(key, data) {
  return function() {
    return key;
  };
});

奖金

由于我们正在监视该YourApp.tpl函数,因此我们还可以对其进行测试:

expect(YourApp.tpl).toHaveBeenCalledWith("your_template", { model: model, property: value });

附录

如果您还不知道 jasmine-headless-webkit --runner-out 标志并且正在野外调试您的 Jasmine 规格,请查看这篇文章以了解如何生成带有完整回溯的运行器输出报告任何失败.

于 2013-05-05T22:46:43.760 回答