TDD требует определенной организации по Вашему коду. Это могло бы быть неэффективно или трудно читать. Или даже архитектурно неправильно; например, с тех пор private
методы нельзя назвать вне класса, необходимо сделать методы нечастными для создания их тестируемыми, который является просто неправильным.
, Когда код изменяется, необходимо изменить тесты также. С рефакторингом этого может быть большая дополнительная работа.
А что насчет вашего сценария требует библиотеки? Похоже, что с собственным javascript вы могли бы просто:
С jquery было бы довольно легко просто добавить другую функцию для использования. Попробуйте что-то вроде:
//Sample function you're wrapping around
function say_hi(){
alert('hi');
}
//quick jq plugin
jQuery.fn.functionWrap = function(arg,opts){
if(opts.before && typeof(opts.before)=='function'){
opts.before();
}
arg();
if(opts.after && typeof(opts.after)=='function'){
opts.after();
}
};
//sample function to use the wrapper func
function btnPress(){
$().functionWrap(
say_hi,
{
before : function(){ alert('happens before'); },
after : function(){ alert('happens after'); }
}
);
}
Попробуйте добавить это на свою страницу и что-нибудь вроде этого, чтобы проверить это:
<input type="button" value="asdf" onClick="btnPress();" />
Надеюсь, это вам поможет.
Мне нравятся функции переноса, предоставляемые библиотеками: в Prototype есть функция переноса. В ExtJS можно использовать createDelegate или createInterceptor. В Dojo есть декларативный АОП. Без фреймворка можно было бы сделать следующее:
myFunction(){
something();
thirdParty.call(); // or apply
perhapsSomethingElse();
}
Я воспользуюсь решением Фрэнка Швитермана :
new_func = originalFunc
function myExtendedVersion()
{
// do my stuff
new_func();
// do my stuff
}
Вы можете сделать это с помощью плагина jquery AOP: http://code.google.com/p/jquery-aop/
Код будет выглядеть так:
jQuery.aop.around( {target: window, method: 'originalFunc'},
function(invocation) {
// do your stuff
invocation.proceed();
// do your stuff
}
);