Jasmine无头Webkit骨干和把手

时间:2013-03-13 20:00:47

标签: ruby-on-rails backbone.js handlebars.js jasmine jasmine-headless-webkit

我正在使用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。

谢谢!

1 个答案:

答案 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);
  }
};

模板抽象间谍(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以了解如何生成转轮输出报告对任何失败都有完整的回溯。