Как проверить, установлен ли обработчик событий в представлении Marionette.js?
Существует представление Marionette.js, которое действует как форма входа в систему. В следующем примере кода показаны соответствующие части кода, включая уже исправленную ошибку:
MyApp.module("User", function(User, App, Backbone, Marionette, $, _) {
User.LoginView = Marionette.ItemView.extend({
className: "reveal-modal",
template: "user/login",
ui: {
signInForm: "#signin-form"
},
events: {
"submit #signin-form": "onSignInFormSubmit"
},
onRender: function() {
var self = this;
var $el = this.$el;
// [...] Render schema
_.defer(function(){
$el.reveal({
closeOnBackgroundClick: false,
closed: function(){
self.close(); // <-- This is incorrect. Do not close the ItemView directly!
}
});
});
},
onSignInFormSubmit: function(event) {
event.preventDefault();
var errors = this.signInForm.validate();
var data = this.signInForm.getValue();
// [...] Notify that data has been submitted.
},
hideForm: function() {
this.$el.trigger("reveal:close");
}
});
});
Я заметил большую ошибку в моей реализации. В функции обратного вызова closed
Я решил закрыть ItemView напрямую, что неправильно, как вы можете прочитать в документации к Marionette.js:
View реализует метод close, который вызывается менеджерами региона автоматически.
Исправлено: вместо close()
надо позвонить по региону. Я исправил эту ошибку.
Теперь я спрашиваю себя, как я могу на самом деле написать тест, который охватывает проблему. Я использую Жасмин для тестирования. Я заметил, что обработчик событий onSignInFormSubmit
больше не вызывается после того, как я неправильно закрыл ItemView и попытался повторно отправить форму.
Вот первый черновик теста, который, к сожалению, не работает и с исправлением:
it("should call the submit handler for the sign-in form", function() {
spyOn(userController.loginView, "onSignInFormSubmit");
spyOn(userController.loginView.signInForm, "validate").andCallFake(function(params) {
return null;
});
userController.loginView.hideForm();
userController.loginView.ui.signInForm.trigger("submit");
expect(userController.loginView.onSignInFormSubmit).toHaveBeenCalled();
});
Может быть, можно также проверить, зарегистрирован ли обработчик события, например:
expect(userController.loginView.events["submit #signin-form"]).toEqual("onSignInFormSubmit");