我正在使用sht_rails gem在我的Rails3.2/Backbone应用程序中呈现handlebars模板。
我希望在应用程序的主干和rails部分都使用这个.handlebars模板,但到目前为止,我只在主干上使用它。
我是这样使用它的:
class MyApp.views.MyView extends MyApp.views.BaseView
template: SHT['templates/feed_item']
render: ->
data = {}
@$el.html @template(data)
@这在应用程序中工作得很好,一点问题都没有,我的车把模板看起来很可爱。
然而,这对我的js测试没有好处(我使用的是带有Jasmine -headless-webkit的jasmine)
这就是发生的事情:
$ jasmine-headless-webkit
ReferenceError: Can't find variable: SHT这是完全有意义的,因为似乎sht_rails gem注册了SHT变量,然而,当我测试时,它似乎没有这样做。
在运行jhw时,有没有注册SHT变量的好方法?还是茉莉花本身?我甚至不需要模板来呈现我的测试,只要知道模板被调用就足够了。但是现在,在我弄清楚如何注册这个SHT之前,我所有的jasmine测试都是失败的。
谢谢!
发布于 2013-05-06 06:46:44
当我们通过tilt-jade gem在Rails3.2/Backbone/Marionette应用程序中使用jade templates时,我们遇到了同样的问题(因此在下面的代码示例中使用JST变量)。我们的解决方案是创建一个模板抽象,然后在规范执行期间使用Jasmine spies来伪造响应。这种方法还允许我们测试模板的使用、构造等。
间谍通篇
如果您不熟悉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);
}
};模板抽象间谍(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规范,请查看此post,看看如何生成一个runner输出报告,其中包含所有失败的完整回溯。
https://stackoverflow.com/questions/15395290
复制相似问题