Тестирование жасмина с помощью шаблонов - PullRequest
3 голосов
/ 24 октября 2011

Я пытаюсь использовать Jasmine (gem with yaml config) для тестирования приложения Backbone.js.Я использую шаблон подчеркивания, как в примере Todo .

template: _.template($('#item-template').html())

Моя проблема в том, что я не могу загрузить шаблоны перед моими моделями / представлениями, поэтому вызов шаблона вызываетэти классы выдают ошибки при загрузке.

Я читал о плагине jasmine-jquery для выполнения фикстур, но проблема в том, что мои файлы src (модели / представления) загружаются и дают сбой, прежде чем я когда-либо получаюфайл спецификации и могу настроить необходимые приборы.

Как мне загрузить шаблоны достаточно рано, чтобы их можно было использовать для сброса моих классов?

Ответы [ 2 ]

5 голосов
/ 24 октября 2011

Вы можете отложить селектор jQuery, пока он вам не понадобится:

render: function(){
  var templateHtml = $(this.template).html();
  _.template(templateHtml);
}

Или вы можете запустить селектор, когда представление инициализируется:

initialize: function(){
  this.template = _.template($(this.template).html());
}

Или, если вы действительно хотитеоставьте свой код как есть и оцените селектор при определении представления, вы можете обернуть весь код Backbone в функцию, которую вы вызываете, когда хотите инициализировать весь код приложения ... такой как jQuery $(function(){}функция на вашей реальной HTML-странице или beforeEach функция в ваших тестах Jasmine:

<code>MyApp = (function(){
  var myApp = {};</p>

<p>myApp.MyView = Backbone.View.extend({
    template: _.template($("#item-template").html())
    // ...
  });</p>

<p>return myApp;
});

Затем в вашем приложении, чтобы запустить это:

$(function(){
  var myApp = MyApp();
  new myApp.MyView();
  // ...
});

И в вашем тесте Jasmine:

describe("how this thing works", function(){
  beforeEach(function(){
    var myApp = MyApp();
    this.view = new myApp.MyView();
    // ...
  });
});

Если у вас есть одно из этих решений, вы можете использовать что-то вроде Jasmine-jQuery для загрузки ваших приборов.

FWIW: Я склонен использовать комбинацию этих техник по мере необходимости.

1 голос
/ 25 февраля 2013

Одна проблема с первой частью принятого ответа состоит в том, что шаблон компилируется каждый раз, когда создается представление.Одна альтернатива - установить шаблон непосредственно в прототипе представления:

app.TodoView = Backbone.View.extend({
    initialize: function(){
        if (!app.TodoView.prototype.template) {
            app.TodoView.prototype.template = _.template($("#item-template").html());
        }
    }            
});

Таким образом, шаблон компилируется один раз, когда создается первый экземпляр TodoView.

...