Тестирование Jasmine с помощью шаблонов

#templates #backbone.js #bdd #jasmine #jasmine-jquery

#шаблоны #backbone.js #bdd #jasmine #jasmine-jquery

Вопрос:

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

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

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

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

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

Ответ №1:

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

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

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

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

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

 MyApp = (function(){
  var myApp = {};

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

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. … что-то странное происходит с моими блоками кода и форматированием

Ответ №2:

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

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

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