Sinon: Как мы можем переопределить отказ при создании нового объекта ошибки?

Созданный на 1 февр. 2018  ·  6Комментарии  ·  Источник: sinonjs/sinon

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

Я поддерживаю код, который отклоняет строки, и это создает проблемы при тестировании. мои уловы синей птицы ведут себя некорректно.

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

Однако использование sinon.stub().usingPromise('bluebird').rejects('Something'); приводит к созданию объекта ошибки с именем Something. Совершенно не ожидалось.

Прежде чем кто-то скажет, что мы поддерживаем только собственные промисы, давайте разберемся, что они делают!

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

Хммм, они не создают класс Error, они просто отбрасывают исключение, которое было выдано, как бросок.

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

Самый полезный комментарий

Полезность трассировки стека и дискуссии о том, следует ли создавать объекты ошибок в стороне, я согласен с тем, что в целом

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

должен вести себя так же, как

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

В настоящее время это не так, если something является строкой. Я бы сказал, что текущее поведение - это ошибка.

Все 6 Комментарий

Прежде чем кто-то скажет, что мы поддерживаем только собственные промисы, давайте разберемся, что они делают!

Это заблуждение соломенного человека . Вы достаточно хорошо знаете, что мы поддерживаем библиотеки обещаний, поскольку используете их в своем примере.

Сопровождающие Sinon полностью осведомлены о том, как работают обещания JavaScript, в том числе о том, что Promise.reject() передаст все, что вы ему передадите.

Я поддерживаю код, который отклоняет строки

На мой взгляд, отказ от обещаний с помощью String вместо Error действительно оказывает медвежью услугу будущему разработчику, которому приходится отлаживать то, что мы пишем сегодня. Строки не очень полезны для отладки, поскольку они не захватывают трассировку стека. Error с другой стороны делает. Поэтому я считаю, что поведение rejects() желательно, поскольку оно упрощает использование отладчика для быстрого определения того, что пошло не так.

Кажется, вы не согласны, но единственное заявление, которое вы сделали, это то, что Синон не оправдывает ваших ожиданий. Если вы считаете, что поведение по умолчанию следует изменить, опубликуйте аргументы в пользу того, почему, помня, что это изменение может повлиять на многих пользователей.

Если есть веские аргументы в пользу изменения поведения по умолчанию, я не могу себе представить, чтобы кто-либо из сопровождающих Sinon выступил против запроса на перенос, чтобы изменить его.

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

Я бы сказал, что могут быть разные мнения относительно того, действительно ли трассировка стека полезна в определенных сценариях. В моей конкретной ситуации меня на самом деле не волнует трассировка стека, меня интересует только сообщение об ошибке, а затем его передача в другое место. Итак, я написал код для обработки причин отклонения как String, так и Error. Однако, поскольку sinon выполняет для меня приведение String -> Error, я не могу протестировать ветвь своего кода, которая обрабатывает строки. Таким образом, я не могу получить полное покрытие

Полезность трассировки стека и дискуссии о том, следует ли создавать объекты ошибок в стороне, я согласен с тем, что в целом

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

должен вести себя так же, как

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

В настоящее время это не так, если something является строкой. Я бы сказал, что текущее поведение - это ошибка.

Я согласен.

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги