Estou mantendo alguns códigos que rejeitam strings e isso está criando problemas durante o teste. minhas capturas de bluebird não estão se comportando corretamente.
bluebird.rejects('Something')
.catch(e => e === 'Something' /* true */, () => console.log(typeof e) /*string*/)
.catch(() => console.log('should not be here'));
Porém, usar sinon.stub().usingPromise('bluebird').rejects('Something');
acaba criando um objeto de erro com o nome Something. Nem um pouco esperado.
Antes que alguém diga que apoiamos apenas Promessas nativas, vamos investigar o que eles fazem!
Promise.reject('Something')
.catch(e => {
console.log(e === 'Something'); // true
console.log(typeof e); // string
});
Hmmm, eles não criam uma classe Error, eles apenas lançam a exceção que foi dada como um lançamento.
try {
throw 'Something';
} catch (e) {
console.log(e === 'Something'); // true
console.log(typeof e); // string
}
Antes que alguém diga que apoiamos apenas Promessas nativas, vamos investigar o que eles fazem!
Isso é uma falácia do espantalho . Você sabe muito bem que apoiamos bibliotecas prometidas, conforme você as usa em seu exemplo.
Os mantenedores do Sinon estão totalmente cientes de como as promessas do JavaScript funcionam, incluindo que Promise.reject()
passará qualquer coisa que você passar para ele.
Estou mantendo algum código que rejeita strings
Na minha opinião, rejeitar promessas com String
vez de Error
é realmente um desserviço ao Desenvolvedor Futuro, que tem que depurar o que escrevemos hoje. Strings não são muito úteis para depuração, pois não capturam rastreamentos de pilha. Error
por outro lado, sim. Portanto, acho que o comportamento de rejects()
é desejável, pois torna mais fácil usar o depurador para descobrir rapidamente o que deu errado.
Parece que você discorda, mas a única afirmação que você fez é que a Sinon não atende às suas expectativas. Se você acha que o comportamento padrão deve ser alterado, poste argumentos sobre o motivo, tendo em mente que a mudança pode afetar muitos usuários.
Se houver argumentos sólidos para mudar o comportamento padrão, não posso imaginar que nenhum dos mantenedores do Sinon se oporia a uma solicitação de pull para mudá-lo.
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.
Eu diria que pode haver opiniões divergentes sobre se um rastreamento de pilha é ou não realmente útil em determinados cenários. Na minha situação particular, eu realmente não me importo com o rastreamento de pilha, eu só me importo com a mensagem de erro e, em seguida, passá-la para outro lugar. Portanto, escrevi um código para lidar com os motivos de rejeição do tipo String e Error. No entanto, uma vez que o sinon faz a coerção String -> Error para mim, não posso testar o branch do meu código que lida com strings. Como tal, não consigo obter cobertura total
Utilidade do rastreamento de pilha e discussões sobre se deve-se criar objetos de erro à parte, eu concordo que geralmente
const example = sinon.stub().rejects(something);
deve se comportar da mesma forma que
const example = () => Promise.reject(something);
Atualmente, este não é o caso se something
for uma string. Eu diria que o comportamento atual é um bug.
Eu concordo.
Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.
Comentários muito úteis
Utilidade do rastreamento de pilha e discussões sobre se deve-se criar objetos de erro à parte, eu concordo que geralmente
deve se comportar da mesma forma que
Atualmente, este não é o caso se
something
for uma string. Eu diria que o comportamento atual é um bug.