2015-09-10 5 views
1

Все;Как работает пример жасмина-шпиона

Я только начал обучение Жасмин (версия 2.0.3), когда я попал в шпионам разделе, первый пример смущало меня:

describe("A spy", function() { 
    var foo, bar = null; 

    beforeEach(function() { 
    foo = { 
     setBar: function(value) { 
     bar = value; 
     } 
    }; 

    spyOn(foo, 'setBar'); 

    foo.setBar(123); 
    foo.setBar(456, 'another param'); 
    }); 

    it("tracks that the spy was called", function() { 
    expect(foo.setBar).toHaveBeenCalled(); 
    }); 

    it("tracks all the arguments of its calls", function() { 
    expect(foo.setBar).toHaveBeenCalledWith(123); 
    expect(foo.setBar).toHaveBeenCalledWith(456, 'another param'); 
    }); 

    it("stops all execution on a function", function() { 
    expect(bar).toBeNull(); 
    }); 
}); 

Интересно, если кто-нибудь может объяснить, почему функция setBar не влияет на панель, определенную внутри описывающего блока? Как шпионы Жасмина справляются с этим?

Thanks

ответ

4

Потому что вы на самом деле не выполняете методы.

Если вы хотите, чтобы это испытание на провал:

it("stops all execution on a function", function() { 
    expect(bar).toBeNull(); 
}); 

После этих звонков:

foo.setBar(123); 
foo.setBar(456, 'another param'); 

Затем вы должны вызвать and.callThrough для шпиона.

spyOn(foo, 'setBar').and.callThrough(); 

От documentation

Шпионы: and.callThrough

приковав шпиона с and.callThrough, шпион будет по-прежнему отслеживать все звонки на него, но в дополнение он будет делегировать фактическую реализацию .

Что касается вашего вопроса, «как жасмин имеет дело с этим?»

От here вы можете прочитать основное объяснение:

издевается работу по реализации паттерна прокси-сервера. Когда вы создаете объект mock , он создает прокси-объект, который заменяет реальный объект . Затем мы можем определить, какие методы вызывают, и их возвращаемые значения из нашего тестового метода. Mocks затем может быть использована для получения статистики во время выполнения на осматривали функции, такие как:

How many times the spied function was called. 
What was the value that the function returned to the caller. 
How many parameters the function was called with. 

Если вы хотите, чтобы все детали реализации, вы можете проверить исходный код жасмина, который Open Source :)

В этом исходном файле CallTracker вы можете увидеть, как собираются данные о вызове метода.

Немного больше о the proxy pattern.

+1

Спасибо, что меня больше всего интересует, как добиться этого от Jasmine, не выполняя действительную функцию и не влияя на переменные? В основном, как доза копирует все в свою изолированную область (если мое понимание об этом правильно)? Не могли бы вы дать мне более подробную информацию об этом? – Kuan

+0

Позвольте мне уточнить дополнительную информацию. –

+0

Спасибо, я прочитал http://www.tutorialspoint.com/design_pattern/proxy_pattern.htm Из моего понимания, в основном используется внутренний объект для делегирования задачи. Но мне любопытно, как связать мой пример с этим шаблоном. – Kuan

Смежные вопросы