Sinon: ¿Cómo podemos anular el rechazo de la creación de un nuevo objeto de error?

Creado en 1 feb. 2018  ·  6Comentarios  ·  Fuente: sinonjs/sinon

https://github.com/sinonjs/sinon/blob/4310343393b16b92b56526ab4614da4eb2886efa/lib/sinon/default-behaviors.js#L176

Mantengo un código que rechaza cadenas y esto crea problemas durante la prueba. mis capturas de bluebird no se están comportando correctamente.

bluebird.rejects('Something')
    .catch(e => e === 'Something' /* true */, () => console.log(typeof e) /*string*/)
    .catch(() => console.log('should not be here'));

Sin embargo, el uso de sinon.stub().usingPromise('bluebird').rejects('Something'); termina creando un objeto de error con el nombre Algo. No se esperaba en absoluto.

Antes de que alguien diga que solo apoyamos Promesas nativas, ¡investiguemos qué hacen!

Promise.reject('Something')
     .catch(e => {
        console.log(e === 'Something'); // true
        console.log(typeof e); // string
    });

Hmmm, no crean una clase de Error, simplemente lanzan la excepción que se les dio como un lanzamiento.

try { 
    throw 'Something'; 
} catch (e) { 
    console.log(e === 'Something');  // true
    console.log(typeof e); // string
}
Bug Help wanted pinned

Comentario más útil

Dejando de lado la utilidad del seguimiento de la pila y las discusiones sobre si uno debe crear objetos de error, estoy de acuerdo en que,

const example = sinon.stub().rejects(something);

debería comportarse igual que

const example = () => Promise.reject(something);

Actualmente, este no es el caso si something es una cadena. Yo diría que el comportamiento actual es un error.

Todos 6 comentarios

Antes de que alguien diga que solo apoyamos Promesas nativas, ¡investiguemos qué hacen!

Esa es una falacia del hombre de paja . Sabes lo suficientemente bien que apoyamos las bibliotecas de promesas, ya que las usas en tu ejemplo.

Los mantenedores de Sinon son plenamente conscientes de cómo funcionan las promesas de JavaScript, incluido que Promise.reject() pasará todo lo que le pase.

Mantengo un código que rechaza cadenas

En mi opinión, rechazar promesas con String lugar de Error realmente le está haciendo un flaco favor a Future Developer, que tiene que depurar lo que escribimos hoy. Las cadenas no son muy útiles para la depuración, ya que no capturan seguimientos de pila. Error por otro lado lo hace. Por lo tanto, creo que el comportamiento de rejects() es deseable, ya que eso facilita el uso del depurador para descubrir rápidamente qué salió mal.

Parece que no estás de acuerdo, pero la única afirmación que has hecho es que Sinon no cumple con tus expectativas. Si cree que se debe cambiar el comportamiento predeterminado, publique argumentos que expliquen por qué, teniendo en cuenta que el cambio tiene el potencial de afectar a muchos usuarios.

Si hay argumentos sólidos para cambiar el comportamiento predeterminado, no puedo imaginar que ninguno de los mantenedores de Sinon se opondría a una solicitud de extracción para cambiarlo.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

Yo diría que podría haber opiniones diferentes sobre si un seguimiento de pila es realmente útil en ciertos escenarios. En mi situación particular, en realidad no me importa el seguimiento de la pila, solo me importa el mensaje de error y luego pasarlo a otro lugar. Así que escribí código para manejar los motivos de rechazo de tipo String y Error. Sin embargo, dado que sinon hace la coerción String -> Error por mí, no puedo probar la rama de mi código que maneja cadenas. Como tal, no puedo obtener una cobertura completa.

Dejando de lado la utilidad del seguimiento de la pila y las discusiones sobre si uno debe crear objetos de error, estoy de acuerdo en que,

const example = sinon.stub().rejects(something);

debería comportarse igual que

const example = () => Promise.reject(something);

Actualmente, este no es el caso si something es una cadena. Yo diría que el comportamiento actual es un error.

Estoy de acuerdo.

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

¿Fue útil esta página
0 / 5 - 0 calificaciones