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
}
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.
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,
debería comportarse igual que
Actualmente, este no es el caso si
something
es una cadena. Yo diría que el comportamiento actual es un error.