Есть некоторые проблемы с вашим подходом. Сначала вы шпионите за своим классом, и вы хотите его протестировать, ведь юнит-тест не должен работать, потому что вы проверяете внутреннюю логику своего класса, а не его поведение. Во-вторых, и по этой причине ваш тест не пройден, вы не прикрепили свои представления в DOM. Поэтому вы либо присоединяете свой el к DOM, либо запускаете событие click непосредственно к el: $('#add_new_task', this.view.el).click()
.
Btw. Базовый способ создания элементов и событий связывания затрудняет написание хороших модульных тестов, потому что вы вынуждены работать с DOM и jquery. Лучший способ написания тестируемого кода - всегда передавать все зависимости конструктору и не создавать новые экземпляры в коде, потому что эти объекты сложно тестировать. Так что в вашем случае было бы намного проще внедрить объект el в конструктор как объект jquery и вручную в события. Делая это таким образом, вы можете протестировать свой класс без каких-либо зависимостей от DOM или jquery.
Так что в вашем случае конструктор будет выглядеть так:
initialize: function(){
this.el.click(_.bind( this, 'addTask'));
}
А твой тест:
var el = {click: function(){}};
spyOn( el, 'click');
new T.views.NewTaskView({el: el});
expect(el.click).toHaveBeenCalled(); //test the click event was bind
//call the function that was bind to the click event,
//which is the same as trigger the event on a real DOM object
el.click.mostRecentCall.args[0]()
В конце концов вы должны решить, какой подход будет соответствовать вашим потребностям. Облегченный код с помощниками магистралей или лучший тестируемый код с меньшим количеством зависимостей от jquery, DOM и магистрали.