Sinon: Espiões nomeados

Criado em 25 fev. 2013  ·  13Comentários  ·  Fonte: sinonjs/sinon

Ajudaria na legibilidade das mensagens de erro de asserção se espiões (além dos de propriedade do objeto) pudessem ser criados com nomes. Por exemplo, os espiões Jasmine permitem isso.

Help wanted

Comentários muito úteis

Estou vendo isso; ele sempre diz que o nome é proxy - mas se i Object.defineProperty(spy, 'name', { value: 'new name' }) então ele reporta "novo nome".

Seria ótimo reabrir isso.

Todos 13 comentários

Sinon inspeciona o nome da função agrupada. Assim, você pode nomear o espião envolvendo uma função nomeada vazia.

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

Essa técnica também permite que você produza uma função com um comprimento específico:

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

Pelo que posso ver, é sempre "proxy" como um nome de função. Tem certeza que este comentário é verdadeiro?

Pelo que posso ver, é sempre "proxy" como um nome de função. Tem certeza que este comentário é verdadeiro?

Você se importaria de postar um exemplo executável?

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

Não me lembro o que fiz antes, mas estava recebendo a saída do Mocha de testes com falha em que o nome da função era "proxy" e você não saberia que era "doStuff". Se eu conseguir lembrar exatamente o que era, postarei

Estou vendo isso; ele sempre diz que o nome é proxy - mas se i Object.defineProperty(spy, 'name', { value: 'new name' }) então ele reporta "novo nome".

Seria ótimo reabrir isso.

Eu superei isso através do seguinte:

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

@Tbhesswebber que não funciona quando o código que não é de teste depende do nome da função.

Ah ... excelente ponto. Estou trabalhando em um currículo para ensinar funções de ordem superior (usando Array.prototype como ponto de partida), que é o que me leva a este problema. Caso de uso muito diferente!

PS - testar detalhes de implementação é realmente tedioso quando você está realmente _tentando_!

Eu posso ver como isso seria útil. Se alguém quiser se aprofundar nisso, seria legal.

Pode ser que existam recursos ou testes que dependem do nome da função retornada. Se for esse o caso, devemos discutir como contornar isso.

@mroderick ao criar um espião com um original, Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name }) deve fazer isso?

Acho que costumava ser um recurso que tínhamos - nomear o espião dando um nome à função - acho que se perdeu no caminho. Aceito a proposta de permitir nomeá-lo explicitamente. Mas não deveríamos mudar também o nome do „proxy“? Acho que uma função espionada deve ser o mais parecida possível com a original. Asseguramos o arity correto, mas mudamos o nome agora. Parece errado.

Acabei de perceber que também temos spy.named(name) na API 😆 Ela define uma propriedade displayName no espião. Também deve mudar o nome das funções, eu acho. Dando uma olhada nisso agora.

O patch de # 1987 foi lançado em v7.2.7 . Informe-nos se isso for satisfatório para todos ❤️

Esta página foi útil?
0 / 5 - 0 avaliações