2016-06-01 11 views
3

Sinon sandbox (или sinon экземпляр) передается извне в область сценария. Внутренняя функция (а не метод) может быть необязательно шпионила/заштрихована с песочницей Sinon.Restore spied/stubbed функция с песочницей Sinon

Sinon участвует в каком-то обезвреживании обезьян (не модульное тестирование). Концепция песочницы Sinon очень хорошо подходит для использования - до этого момента.

Исходя из того, что функция spy не может быть заменена методом spy. Это не идеальный сценарий, но дизайн не может быть изменен.

const originalCallback = callback; 

callback = sinonSandbox.spy(callback); 
thirdPartyFn(callback); 

// how can this be achieved? 
// sinonSandbox.onRestore(() => thirdPartyFn(originalCallback)); 

Как приложение может быть уведомлено о восстановлении песочницы для восстановления функции шпионажа? Есть ли крючок, который будет запущен на мероприятии «восстановить»? Существуют ли сторонние расширения Sinon, которые могут помочь?

ответ

0

Как представляется, у Sinon нет механизма уведомления о восстановлении песочницы. Поскольку работа sandbox.restore() является to call restore method на each faked function, я закончил латать поддельной собственного restore как наиболее подходящее решение:

const originalCallback = callback; 
callback = sinonSandbox.spy(callback); 

const originalRestore = callback.restore; 
callback.restore = function (...args) { 
    originalRestore.apply(this, args); 
    thirdPartyFn(originalCallback); 
} 
1

Я бы издеваться/окурок функцию восстановления:

var originalRestore = sinonSandbox.restore; 

sinonSandBox.restore =() => { 
    originalRestore(); 
    // insert code here 
}; 
+0

Я надеялся избежать этого, но да, это выглядит, как будто это все о обезьяньего заплат. Кстати, я считаю, что это должно быть 'originalRestore.call (sinonSandbox)' (не уверен в аргументах, но похоже, что 'restore' не имеет некоторых). – estus

+0

Да, ты прав :) – LoremIpsum

1

Первоначально Sinon не публиковать какие-либо события или предложить какие-либо крючки, но вы можете создать:

var spyInstance = sinonSandbox.spy(callback); 

(function (original) { 

    spyInstance.restore = function() { 
     original.apply(this, arguments); // call the original restore function 
     events.publish("sinon", "restore-end"); // publish the event to decouple this module from receiving module 
    } 

})(spyInstance.restore); 

тогда, где-то вниз по линии в другом модуле:

events.subscribe("sinon", "restore-end", function() { 
    // call some code to execute when the sinon spy is restored 
}); 

объект событий - это ваш глобальный паб/дополнительный модуль или что-то в этом роде ke это.