Я отправляю этот ответ, чтобы обратиться к комментарию в коде OP @ Tri-Vuong - что и послужило моей основной причиной посещения этой страницы:
Я хочу переопределить шпиона ... вот и сделайте это немного по-другому
Ни один из ответов до сих пор не затронул этот вопрос, поэтому я опубликую то, что я узнал, и обобщу другие ответы.
@ Алисса правильно произнесла это, когда объяснила, почему плохая идея установить isSpy
на false
- эффективно шпионить за шпионом, что приводит к автоматическому отключению поведения Жасмин, больше не функционирующей должным образом. Ее решение (помещенное в контекст OP и обновленное для Jasmine 2+) было следующим:
beforeEach(() => {
var spyObj = spyOn(obj,'methodName').and.callFake(function(params){
}) // @Alissa's solution part a - store the spy in a variable
})
it("should do the declared spy behavior", () => {
// Act and assert as desired
})
it("should do what it used to do", () => {
spyObj.and.callThrough(); // @Alissa's solution part b - restore spy behavior to original function behavior
// Act and assert as desired
})
it("should do something a little differently", () => {
spyObj.and.returnValue('NewValue'); // added solution to change spy behavior
// Act and assert as desired
})
Последний тест it
демонстрирует, как можно изменить поведение существующего шпиона на что-то другое, кроме исходного поведения: «and
-declare» новое поведение в spyObj, ранее сохраненное в переменной в beforeEach()
, Первый тест иллюстрирует мой вариант использования для этого - я хотел, чтобы шпион вел себя определенным образом в большинстве тестов, но затем изменил его на несколько тестов позже.
Для более ранних версий Jasmine измените соответствующие вызовы на .andCallFake(
, .andCallThrough()
и .andReturnValue(
соответственно.