Как проверить, установлен ли обработчик событий в представлении 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");

0 ответов

Другие вопросы по тегам