Sinon: Именные шпионы

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

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

Help wanted

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

Я вижу это; он всегда говорит, что имя - proxy но если я Object.defineProperty(spy, 'name', { value: 'new name' }) он сообщает "новое имя".

Было бы здорово снова открыть это.

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

Синон проверяет имя функции в оболочке. Таким образом, вы можете дать шпиону имя, обернув пустую именованную функцию.

var spy = sinon.spy(function doStuff() {});

Этот метод также позволяет создавать функцию определенной длины:

var spy = sinon.spy(function doStuff(a, b, c) {}); // spy.length === 3

Насколько я понимаю, в качестве имени функции всегда используется «прокси». Вы уверены, что этот комментарий правдив?

Насколько я понимаю, в качестве имени функции всегда используется «прокси». Вы уверены, что этот комментарий правдив?

Не могли бы вы опубликовать работоспособный пример?

// test/index.js
var sinon = require('sinon');

var spy = sinon.spy(function doStuff() {
    console.log('Name: ' + spy.name);
});

spy();
➜  sinon-test node test/index.js 
Name: proxy

Я не могу вспомнить, что я делал раньше, но я получал результат Mocha из неудачных тестов, где имя функции было «proxy», а вы не знали, что это «doStuff». Если я смогу вспомнить, что именно это было, я опубликую

Я вижу это; он всегда говорит, что имя - proxy но если я Object.defineProperty(spy, 'name', { value: 'new name' }) он сообщает "новое имя".

Было бы здорово снова открыть это.

Я обошел это с помощью следующего:

const mapMethod = sinon.spy(Array.prototype, 'map');
const methodName = map.wrappedMethod.name;
console.log(methodName); // 'map'

@Tbhesswebber , который не работает, если не тестовый код полагается на имя функции.

Ах ... отличный момент. Я работаю над учебными планами для обучения функциям высшего порядка (используя Array.prototype в качестве отправной точки), что и привело меня к этой проблеме. Совершенно другой вариант использования!

PS - детали тестирования реализации действительно утомительны, когда вы действительно пытаетесь это сделать!

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

Возможно, существуют функции или тесты, зависящие от имени возвращаемой функции. Если это так, мы должны обсудить, как это обойти.

@mroderick при создании шпиона с оригиналом Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name }) должен это делать?

Я думаю, что раньше у нас была такая возможность - дать шпиону имя путем присвоения имени функции - думаю, он потерялся по пути. Я согласен с предложением разрешить называть его явно. Но не следует ли нам также изменить имя «прокси»? Мне кажется, шпионская функция должна выглядеть как можно ближе к исходной. Обеспечиваем правильную арность, но сейчас меняем название. Кажется неправильным.

Я только что понял, что у нас также есть spy.named(name) в API 😆 Он устанавливает свойство displayName для шпиона. Я думаю, это также должно изменить имя функции. Взглянем на это сейчас.

Патч от №1987 был выпущен в v7.2.7 . Пожалуйста, дайте нам знать, всех ли это устраивает ❤️

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