JavaScript cómo simular el método de confirmación

Tengo el siguiente código en mi código JavaScript.

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

Estoy escribiendo una testing para este pedazo de código. ¿Cómo me burlo del método window.confirm? Intenté seguir el código pero no funcionó.

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

Puedo mover el método window.confirm a otra function y luego puedo simular ese método. Sin embargo, me preguntaba si hay una mejor solución.

Estoy usando Jasmine para testings unitarias y me he burlado de la alerta y confirmo con los siguientes

 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; }; 

Entonces puedo decir:

 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 }); }); 

No es perfecto, y si tiene varias confirmaciones que podrían aparecer entre la configuration confirmValue, podría tener problemas. Quizás entonces sería bueno configurar una señal de los valores de retorno de confirmación esperados … difícil …

Pensaría en implementar un contenedor de methods estáticos en la window (u otro) object. Luego, proporcione su envoltorio a lo que sea que use el método estático. Obviamente, esto es más fácil si está utilizando una implementación basada en "class". Luego, para simular el método, simplemente proporcione un contenedor diferente que devuelva el valor que desea.

 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'); } 

Tu propio código funciona bien para mí en IE. Solo lo siguiente en el scope global debe anularlo:

 var confirm = function () { return true; } 

EDITAR
He visto algunas preguntas sobre SO en el pasado sobre tratar de anular la confirm , sobre todo porque no les gusta (¿y quién lo haría?). Si intenta eludirlo por este tipo de razones, le sugiero que busque cambiar su código para implementar un reemploop basado en callback para confirmar. Eche un vistazo a la confirmación modal de jQuery UI como un buen ejemplo de esto.