nodejs mocks mock example javascript mocha sinon stubbing

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:

  1. 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.

  2. 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.

Ver el código fuente del código stub()

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)?



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