Было бы легче читать сообщения об ошибках утверждения, если бы шпионы (кроме тех, которые принадлежали к свойствам объекта) могли быть созданы с именами. Например, шпионы Jasmine это допускают.
Синон проверяет имя функции в оболочке. Таким образом, вы можете дать шпиону имя, обернув пустую именованную функцию.
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
. Пожалуйста, дайте нам знать, всех ли это устраивает ❤️
Самый полезный комментарий
Я вижу это; он всегда говорит, что имя -
proxy
но если яObject.defineProperty(spy, 'name', { value: 'new name' })
он сообщает "новое имя".Было бы здорово снова открыть это.