Почему spyOn "останавливает все выполнение функции" в Jasmine (запрашивая разъяснения по документации Jasmine 2.2 для шпионов)
В документации Jasmine 2.2 я не могу понять последнюю спецификацию, которая демонстрирует основное использование шпионов.
в beforeEach()
раздел мы устанавливаем bar = null
тогда мы следим за foo.setBar
а потом мы позвоним foo.setBar
дважды. Я не могу понять почему bar === null
в последнем спец. Не должно ли это быть bar === 456
прежде чем шпион будет снесен для спецификации?
Вот пример:
describe("About a Spy", function(){
var foo, bar = null;
beforeEach(function() {
foo = {
setBar: function(value) {
bar = value;
}
};
spyOn(foo, "setBar"); // we spy
foo.setBar(123); // shouldn't bar === 123 here?
foo.setBar(456, 'another param'); // and bar === 456 here?
});
it("stops all execution on a function", function() {
// What, why, how?
expect(bar).toBeNull();
//I expected this to be the case, but it's not.
//expect(bar).toBe(456);
});
});
Я, должно быть, неправильно понимаю, как beforeEach создает и разрушает область видимости переменных или, возможно, есть шаг, где переменные внутри describe
раздел получить сброс? Или их никогда не трогали, потому что мы использовали только шпионскую функцию, а не реальную функцию?
Было бы очень полезно, если бы вы могли объяснить, что именно происходит с переменной bar
в этом иске спецификации, так что я мог понять, почему его значение остается нулевым в последней спецификации.
Спасибо!
1 ответ
Если вы посмотрите внимательно, вы можете понять, что spyOn заменяет исходную функцию шпионом, который перехватывает вызовы функций и отслеживает много потенциально полезной информации о них. Проблема, с которой мы сталкиваемся выше, состоит в том, что, как только мы заменили исходную функцию, мы потеряли ее возможности. Мы можем исправить это с помощью andCallThrough. Если вы вызываете andCallThrough() после вызова spyOn, шпион затем передает любые вызовы ему до исходной функции
http://www.joezimjs.com/javascript/javascript-unit-testing-with-jasmine-part-2/