Sinon: Espías nombrados

Creado en 25 feb. 2013  ·  13Comentarios  ·  Fuente: sinonjs/sinon

Sería útil para la legibilidad de los mensajes de error de aserción si se pudieran crear espías (distintos de los de propiedad del objeto) con nombres. Por ejemplo, los espías de Jasmine lo permiten.

Help wanted

Comentario más útil

Estoy viendo esto; siempre dice que el nombre es proxy - pero si i Object.defineProperty(spy, 'name', { value: 'new name' }) entonces informa "nuevo nombre".

Sería genial reabrir esto.

Todos 13 comentarios

Sinon inspecciona el nombre de la función envuelto. Por lo tanto, puede nombrar al espía envolviendo una función con nombre vacía.

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

Esta técnica también le permite producir una función con una longitud específica:

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

Por lo que puedo ver, siempre es "proxy" como nombre de función. ¿Estás seguro de que este comentario es cierto?

Por lo que puedo ver, siempre es "proxy" como nombre de función. ¿Estás seguro de que este comentario es cierto?

¿Le importaría publicar un ejemplo ejecutable?

// 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

No recuerdo lo que hice antes, pero estaba obteniendo resultados de Mocha de pruebas fallidas donde el nombre de la función era "proxy" y no sabías que era "doStuff". Si puedo recordar qué era exactamente, publicaré

Estoy viendo esto; siempre dice que el nombre es proxy - pero si i Object.defineProperty(spy, 'name', { value: 'new name' }) entonces informa "nuevo nombre".

Sería genial reabrir esto.

Lo solucioné a través de lo siguiente:

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

@Tbhesswebber que no funciona cuando el código que no es de prueba se basa en el nombre de la función.

Ah ... excelente punto. Estoy trabajando en planes de estudio para enseñar funciones de orden superior (usando Array.prototype como punto de partida), que es lo que me llevó a este problema. Caso de uso muy diferente!

PD: ¡probar los detalles de la implementación es realmente tedioso cuando en realidad lo estás intentando!

Puedo ver la utilidad de esto. Si alguien quiere profundizar en esto, sería genial.

Puede ser que haya características o pruebas que dependan del nombre de la función devuelta. Si ese es el caso, deberíamos discutir cómo solucionarlo.

@mroderick al crear un espía con un original, Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name }) debería hacerlo?

Creo que esta solía ser una característica que teníamos: nombrar al espía al darle un nombre a la función, supongo que se perdió en el camino. Estoy de acuerdo con la propuesta de permitir nombrarlo explícitamente. ¿Pero no deberíamos cambiar también el nombre del "proxy"? Siento que una función espiada debería parecerse lo más posible a la original. Aseguramos la aridad correcta, pero ahora cambiamos el nombre. Parece mal.

Me acabo de dar cuenta de que también tenemos spy.named(name) en la API 😆 Establece una propiedad displayName en el espía. También debería cambiar el nombre de las funciones, creo. Echando un vistazo a esto ahora.

El parche de # 1987 fue lanzado en v7.2.7 . Háganos saber si esto es satisfactorio para todos ❤️

¿Fue útil esta página
0 / 5 - 0 calificaciones