Извините за название.Я просто вижу интересное поведение, которое хочу понять.Код:
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() {
})
})
});
Мое понимание того, что должно происходить при выполнении теста:
-
beforeAll
вызывает testFunction.act
, что экономит element
и привязывает к нему обработчик клика - в первой спецификации, сохраненный
element
, для которого был назначен обработчик события для # 1, называется - во второй спецификации, происходит то же самоеопять же, как в первой спецификации
Однако из вывода 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
Может кто-нибудь объяснить мне, почему это происходит?