javascript - mocks - sinon npm
Stubbing window.location.href con Sinon (3)
Los apéndices no pueden reemplazar atributos, solo funciones.
El error lanzado refuerza esto:
TypeError: El código auxiliar personalizado debe ser una función o un descriptor de propiedad
De la documentación:
¿Cuándo usar talones?
Use un talón cuando quiera:
Controla el comportamiento de un método desde una prueba para forzar el código hacia una ruta específica. Los ejemplos incluyen forzar a un método a lanzar un error para probar el manejo de errores.
Cuando desea evitar que se llame directamente a un método específico (posiblemente porque provoca un comportamiento no deseado, como XMLHttpRequest o similar).
http://sinonjs.org/releases/v2.0.0/stubs/
Solución posible
Mientras que muchos objetos incorporados pueden ser reemplazados (para pruebas) algunos no pueden ser reemplazados. Para esos atributos, puede crear objetos de fachada que luego debe usar en su código y poder reemplazarlos en las pruebas.
Por ejemplo:
var loc = {
setLocationHref: function(newHref) {
window.location.href = newHref;
},
getLocationHref: function() {
return window.location.href;
}
};
Uso:
loc.setLocationHref(''http://acme.com'');
A continuación, puede escribir en su prueba
var stub = sinon.stub(loc, ''setLocationHref'').returns(''http://www.foo.com'');
Tenga en cuenta la llamada de returns()
encadenadas returns()
. Hubo otro error en su código: el tercer argumento debe ser una función, no un valor en otro tipo. Es una devolución de llamada, no lo que debe devolver el atributo.
Estoy intentando probar algún código del lado del cliente y para eso necesito apilar el valor de la propiedad window.location.href
usando Mocha / Sinon.
Lo que he probado hasta ahora ( usando este ejemplo ):
describe(''Logger'', () => {
it(''should compose a Log'', () => {
var stub = sinon.stub(window.location, ''href'', ''http://www.foo.com'');
});
});
El corredor muestra el siguiente error:
TypeError: El código auxiliar personalizado debe ser una función o un descriptor de propiedad
Cambiando el código de prueba a:
describe(''Logger'', () => {
it(''should compose a Log'', () => {
var stub = sinon.stub(window.location, ''href'', {
value: ''foo''
});
});
});
Lo que produce este error:
TypeError: se intentó ajustar la propiedad de cadena href como función
Pasar una función como tercer argumento a sinon.stub
tampoco funciona.
¿Hay alguna forma de proporcionar una cadena falsa window.location.href
, evitando también la redirección (ya que estoy probando en el navegador)?
Use window.location.assign(url)
lugar de sobrescribir el valor de window.location
. Luego, simplemente puede apilar el método de assign
en el objeto window.location
.
http://www.w3schools.com/jsref/met_loc_assign.asp
ACTUALIZACIÓN: Probé esto en un navegador sin cabeza, pero puede que no funcione si ejecuta sus pruebas en Chrome. Ver la respuesta de @ try-catch-finally .
beforeEach
usar global
para simular el objeto de window
para su prueba antes de beforeEach
p.ej
it(''should compose a Log'', () => {
global.window = {
location: {
href: {
value: ''foo''
}
}
}
//.... call the funciton
});