Para fazer isso é preciso isolar a chamada ao javascript em uma função, e no teste unitário substituir essa função por uma outra que apenas a substitua por uma comportamento esperado de acordo com o teste. Vamos ver como fazer isso:
Primeiro isolamos a chamada a ExternalInterface.call em um função que serviria apenas como proxy. Em linguagens menos dinâmicas precisaríamos isolar essa função em uma outra classe pois não seria possível substitui-la posteriormente:
public function executarJavaScript(funcao:String,parametros:Object = null) {
try {
return ExternalInterface.call(funcao,parametros);
} catch(erro:Error) {
return null;
}
}
dynamic public class MinhaClasse {
public var js:Function;
function MinhaClasse() {
js = executarJavaScript;
}
public function executarJavaScript(funcao:String,parametros:Object = null) {
//Conteudo da função já exibido acima :P
}
//Outras funções
}
public function obterUrlAtual():String {
try {
var objJs = js("document.location.href.toString");
if( !objJs ) objJs = js("document.location.toString");
if( !objJs ) return null;
return new String(objJs);
} catch(e:Error) {
return null;
}
}
public function testSegundFuncaoJavaScriptEhChamada():void {
var m:MinhaClasse = new MinhaClasse();
m.js = function(funcao:String,parametros:Object = null) {
if(funcao=="document.location.toString") {
return "http://programandosemcafeina.blogspot.com";
} else {
return null;
}
}
var s:String = m.obterUrlAtual();
assertEquals("Quando a primeira função retorna null a segunda função deve ser chamada","http://programandosemcafeina.blogspot.com",s);
}
Bem legal este post Tiago.
ResponderExcluir