TL; DR: следите за методом экземпляра, а не за прототипом.
Я думаю, вам нужно настроить тест по-другому. Слишком много проблем и слишком много ожиданий в блоке it
, и вы также загрязняете глобальное пространство имен, что может вызвать проблемы с тестами.
beforeEach(function() {
loadFixtures('promptPage.tmpl');
var model = new PromptModel();
this.view = new PromptView({model:model});
this.view.render();
this.button = this.view.$("#btnYes");
});
it("should render the button", function(){
expect(this.button.length).toBe(1);
});
it("should be able to answer a question with yes", function() {
spyOn(this.view, 'answerYes');
this.button.click();
expect(this.view.answerYes).toHaveBeenCalled();
});
Вам не нужно строго рассчитывать длину кнопки. Если кнопка не имеет длины (не найдена), вы получите другие сбои. Но, возможно, вы захотите сделать это, чтобы было проще понять, что представление не отображается правильно.
Вы должны также шпионить за экземпляром view
, как вы это делали. Определение PromptView
добавляет метод answerYes
к прототипу, да, но тот, за кем вы хотите следить, - это экземпляр представления, а не прототип.
Если вы следите за методом прототипа, то каждый раз, когда вы пытаетесь использовать это представление в своих тестах, метод answerYes
будет шпионом, а не фактическим методом. Это может звучать хорошо, но это вызовет проблемы, так как у вас не будет доступа к действительным шпионским данным, когда вы вызываете этот метод несколько раз. Он просто накапливает все вызовы на этом шпионе. Если вы попытаетесь шпионить за прототипом дважды, вы можете оказаться шпионом-шпионом, что было бы странно и могло вызвать проблемы.