#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
.