2010-02-16 17 views
8

Ho il seguente codice nel mio codice JavaScript.JavaScript come simulare il metodo di conferma

if (window.confirm('Are you sure?')) { 
    AdminData.actOnResult('delete'); 
} 

Sto scrivendo il test per questo pezzo di codice. Come faccio a simulare il metodo window.confirm? Ho provato a seguire il codice ma non ha funzionato.

window.confirm = function(arg) { 
    return true; 
}; 

posso spostare il metodo window.confirm ad un'altra funzione e quindi posso deridere tale metodo. Comunque mi stavo chiedendo se c'è una soluzione migliore.

risposta

1

Il proprio codice funziona correttamente per me in IE. Proprio il seguente nell'ambito globale dovrebbe ignorarlo:

var confirm = function() { return true; } 

EDIT
Ho visto un paio di domande sul SO in passato di cercare di ignorare confirm, soprattutto perché a loro non piace questo (e chi vorrebbe?). Se stai cercando di aggirarlo per questo motivo, ti suggerisco di modificare il codice per implementare una sostituzione basata su callback per la conferma. Dai un'occhiata a jQuery UI's modal confirm per un buon esempio di questo.

1

Vorrei pensare a implementare un wrapper attorno ai metodi statici sull'oggetto della finestra (o altro). Quindi fornire il proprio wrapper a qualsiasi utilizzo del metodo statico. Ovviamente questo è più facile se si utilizza un'implementazione basata sulla "classe". Quindi, per simulare il metodo, è sufficiente fornire un wrapper diverso che restituisca il valore desiderato.

var windowWrapper = { 
    confirm: function(msg) { return confirm(msg); }, 
    ... 
}; 

var mockWrapper = { 
    confirm: function(msg) { return true; }, 
    ... 
} 

var wrapper = windowWrapper; 
if (test) { 
    wrapper = mockWrapper; 
} 

...

if (wrapper.confirm('Are you sure?')) { 
    AdminData.actOnResult('delete'); 
} 
3

Sto usando Jasmine per unit testing e hanno deriso allarme e confermare con il seguente

alert = function (alertString) {debug.log('ALERT:', alertString);}; 

var confirmValue = true; //set this before you expect the confirm statement to be shown 
confirm = function (confirmString) { 
    debug.log('CONFIRM:', confirmString, confirmValue); 
    return confirmValue; 
}; 

Poi posso dire:

describe("test", function() { 
    it('should test true confirm workflow', function() { 
     confirmValue = true; // or false if you like 
     //expect outcomes that would come from any confirms being called with true 
    }); 
}); 

Non è perfetto, e io Se hai più conferme che potrebbero apparire tra l'impostazione di confirmValue, potresti trovarti nei guai. Forse allora sarebbe bene impostare un segnale di conferma dei valori di ritorno attesi ... ingannevole ...

+0

IMO delle 3 risposte finora, questo affronta quello che Nick sta chiedendo. Oggi c'è poco su Stackoverflow sulla simulazione statica in Javascript oltre alla tua risposta. –

Problemi correlati