我正在使用sht_rails gem在我的Rails 3.2 / Backbone App中呈现把手模板。
我希望在应用程序的主干和rails部分使用此.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。
谢谢!
答案 0 :(得分:1)
在我们的Rails 3.2 / Backbone / Marionette应用程序中通过jade templates gem(因此下面的代码示例中为JST
变量)使用tilt-jade时遇到了同样的问题。我们的解决方案是创建模板抽象,然后使用Jasmine间谍在规范执行期间伪造响应。这种方法还允许我们测试模板使用,构造等。
如果您不熟悉Jasmine spies:
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:
// MONKEYPATCH - Overriding Renderer to use YourApp template function
Marionette.Renderer = {
render: function(template, model){
return YourApp.tpl(template, model);
}
};
现在我们可以监视如下:
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规范,请查看此post以了解如何生成转轮输出报告对任何失败都有完整的回溯。