Жасмин - почему спецификации не удается (связано с инициализацией, до операторов и т. Д.) - PullRequest
0 голосов
/ 13 декабря 2018

Извините за название.Я просто вижу интересное поведение, которое хочу понять.Код:

var element; 

var testFunction = (function() {
  var mount = false;

  return {
    act: function() {
      if (mount == false) {
        element = $("#element")
        element.click(function() {
          console.log("detected click")
        })
        mount = true
      }
    }
  }
})();

Для меня важно, чтобы действия в testFunction.act выполнялись только ОДИН РАЗ, поэтому используется mount.Один из многих вариантов использования, которого это достигает, состоит в том, что в тестовом коде, если мы вызываем testFunction.act несколько раз, нет подключенных обработчиков множественных щелчков, что было бы проблематично, так как вы ожидаете только кликать, а некратный.

Однако наличие mount вызывает другое явление, когда проходит только первая спецификация.

Спецификация:

fdescribe("testFunction", function() {
  beforeAll(function() {
    element_spec = affix("#element")
    testFunction.act();
  })
  describe("first spec", function() {
    beforeEach(function() {
      console.log("first spec")
      console.log(element.length)
      element_spec.click()
    })
    it("should write in console", function() {
    })
  })
  describe("second spec", function() {
    beforeEach(function() {
      console.log("second spec")
      console.log(element.length)
      element_spec.click()
    })
    it("should write in console", function() {
    })
  })        
});

Мое понимание того, что должно происходить при выполнении теста:

  1. beforeAll вызывает testFunction.act, что экономит element и привязывает к нему обработчик клика
  2. в первой спецификации, сохраненный element, для которого был назначен обработчик события для # 1, называется
  3. во второй спецификации, происходит то же самоеопять же, как в первой спецификации

Однако из вывода console.log ясно, что первый щелчок запускает обработчик щелчков, второй - нет, даже если они оба действуют одинаковосохранено element, которое присутствует (length == 1) для обоих тестов.

first spec
1
detected click
second spec
1

Я могу дополнительно подтвердить это, отметив, что если я сделаю 2 изменения: 1) удалите элемент mount в testFunction.actи 2) измените beforeAll на beforeEach, тогда я получу ожидаемый console.log вывод:

first spec
1
detected click
second spec
1
detected click

Может кто-нибудь объяснить мне, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Интересно, что между beforeAll и beforeEach имеется существенная разница.

. Для каждой спецификации dom будет отображаться свежим, а старый контекст теряется.Таким образом, для каждого теста вам необходимо заново присоединить прослушиватель событий.

В вашей реализации mount, являющаяся переменной закрытия, не допускает «прикрепление события» более одного раза.

Так чтоПравильная реализация будет состоять в том, чтобы удалить переменную «замыкание».Вы должны быть в состоянии получить «ожидаемый результат» с «beforeAll».

0 голосов
/ 14 декабря 2018
element.click(function() {
      console.log("detected click")
    })

это не связывает.нажмите его отправку.

, если вы хотите связать, сделайте это вместо:

element.addEventListener("click",function(){console.log("detected click")});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...