Miałem kilka interesujących udręk, próbując sprawdzić, czy poglądy zostały poprawnie powiązane z wydarzeniami. W szkielecie zazwyczaj wiążemy zdarzenia w metodzie initialize, używając czegoś podobnego do: something.bind("change", this.render);
. W moim teście chcę się upewnić, że to powiązanie jest skonfigurowane, więc wykonałem następujące czynności:Testowanie aplikacji backbone.js z jaśminem - jak przetestować wiązania modelu w widoku?
this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
Ale to nie zadziała. Ponieważ powiązanie występuje w funkcji inicjowania MyView, zdarzenie get jest powiązane z funkcją renderowania myView W TYM CZASIE. Kiedy dodajesz swojego szpiega, zawija on funkcję renderowania i ustawia ją z powrotem na miejscu w myView.render. Ale zamknięcie stworzone przez pierwsze wiązanie nadal istnieje i jesteśmy całkowicie spoczęci. Więc co możemy z tym zrobić? To, co zrobiłem, jest przenieść mój wiążą wezwanie do funkcji indywidualne, coś jak:
myView = Backbone.View.extend({
initialize: function(){
_.bindAll(this, "render");
this.initialize_model_bindings();
},
initialize_model_bindings: function(){
something.bind("change", this.render);
},
render: function(){ //... }
});
i moja próba wówczas wygląda następująco:
this.myView = new MyView();
spyOn(this.myView, "render");
this.myView.initialize_model_bindings();
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
To działa, ale szukam lepszego rozwiązania . Dzięki
Czy możesz wyjaśnić tę kwestię: "Ale zamknięcie stworzone przez pierwsze wiązanie nadal istnieje, a my jesteśmy całkowicie sprowadzeni" ponownie? Mam ten sam problem i próbuję zrozumieć, co się dzieje. Dzięki. –
Po wywołaniu 'new MyView()' wywoływana jest metoda initialize, a funkcja renderowania istniejąca w obiekcie w tym czasie jest powiązana ze zdarzeniem change. Od tego momentu nie można uzyskać dostępu do funkcji renderowania związanej ze zdarzeniem zmiany - jest ona zamknięta w zamknięciu. – idbentley
Dzięki za wyjaśnienia. –