Действительно ли шпионы в Jasmine вызывают функцию, за которой они следят?

#jasmine #jasmine2.0

#jasmine #jasmine2.0

Вопрос:

Я хочу знать, как функция «spyOn» работает внутри. Я читал, что функция ‘spyOn’ внутренне заменяет реализацию отслеживаемой функции. Сохраняет ли она старую функциональность?

В качестве примера предположим, что я хотел шпионить за объектом, который отправляет данные на сервер.

 describe("A spy", function() {
  var object;
    spyOn(object, 'sendDataToServer');
    object.sendDataToServer('Some Message');
});
  

В этом случае сообщение все еще отправляется на сервер или шпион издевается над ним?

Комментарии:

1. не могли бы вы, пожалуйста, объяснить подробнее

Ответ №1:

Сообщение не отправляется на сервер. То, как вы определили шпион, он будет заменять sendDataToServer функцию всякий раз, когда она вызывается в контексте вашего тестового примера.

Вы можете указать более сложный шпион, например, когда хотите вызвать вместо него другую функцию:

 let mySpy = spyOn(object, 'sendDataToServer').and.callFake((message: string) => {
  console.log('I have been called with '   message);
});
object.sendDataToServer('Some Message'); // -> will call the function defined above and log the message passed
  

Или, если вы хотите вызвать реальную функцию:

 let mySpy = spyOn(object, 'sendDataToServer').and.callThrough();
object.sendDataToServer('Some Message'); // -> will call the actual function on object