2010-02-16 16 views
8

Tengo el siguiente código en mi código de JavaScript.JavaScript cómo simular el método de confirmación

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

Estoy escribiendo la prueba para este fragmento 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 función y luego puedo simular ese método. Sin embargo, me preguntaba si hay una mejor solución.

Respuesta

1

Tu propio código funciona bien para mí en IE. Sólo la siguiente en el ámbito global debe anularlo:

var confirm = function() { return true; } 

EDITAR
que he visto algunas preguntas sobre lo que en el pasado acerca de tratar de anular 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 reemplazo basado en devolución de llamada para confirmar. Eche un vistazo a jQuery UI's modal confirm para obtener un buen ejemplo de esto.

1

Pensaría en implementar un contenedor alrededor de métodos estáticos en la ventana (u otro) objeto. 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 "clase". 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'); 
} 
3

estoy usando jazmín para las pruebas unitarias y han burlado de alerta y confirmar con la siguiente

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 yo Si tiene varias confirmaciones que podrían aparecer entre las configuraciones que confirmanValor, podría tener problemas. Quizás entonces sería bueno configurar un indicio de los valores de retorno de confirmación esperados ... engañoso ...

+0

IMO de las 3 respuestas hasta ahora, esta aborda lo que Nick está preguntando. Hoy en día, hay muy poco en Stackoverflow acerca de la burla estática en Javascript, además de su respuesta. –

Cuestiones relacionadas