<p>o sinon falha ao restaurar propriedades em stub no objeto de janela no IE11</p>

Criado em 22 ago. 2018  ·  4Comentários  ·  Fonte: sinonjs/sinon

Descreva o bug
é possível fazer um stub, mas não restaurar algumas propriedades no objeto de janela no IE11, fazendo com que o sinon lance um erro de tipo: TypeError: Cannot redefine non-configurable property '...'

Reproduzir
https://jsbin.com/qixexucasa/edit?js , console, saída - compare o comportamento no IE11 e em qualquer outro navegador.

"TypeError: Cannot redefine non-configurable property 'parent'
   at restore (https://unpkg.com/[email protected]/pkg/sinon.js:3253:13)
   at Global code (https://null.jsbin.com/runner:18:1)"

Comportamento esperado
No IE11 certas propriedades do objeto window não são configuráveis, mas ainda é possível fazer stub e isso é bastante útil nos testes. O comportamento esperado seria um destes:

  1. sinon deve gerar um erro na etapa de stub (não na etapa restore ()) de que não é possível fazer o stub dessa propriedade;
  2. ao fazer o stub da propriedade, o sinon não deve copiar o atributo configurable , há algum motivo para isso? No caso de false value, o sinon apenas cria problemas para si mesmo, portanto não é possível restaurá-lo. Portanto, esta linha deve ser sempre true :
    https://github.com/sinonjs/sinon/blob/638e104d1e6ed9908c1b09bd33d2cba1aa8c217a/lib/sinon/default-behaviors.js#L251

Contexto:

  • Versão da biblioteca: todas as versões são afetadas, testado em 4.4.6 e 6.1.5.

Confirme se é um bug ou um comportamento esperado.

Bug Help wanted hacktoberfest pinned

Comentários muito úteis

Estou tendo o mesmo problema e encontrei a causa disso na linha 258 sinon / default-behaviours.js.

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

Não sei por que deveria seguir a opção configurável do objeto original. Acho que tem que ser sempre verdadeiro porque depois de stubado, ele pode ser restaurado ou reescrito (normalmente sinon.restore ()) independentemente da opção do objeto original.

Corrigi temporariamente esse problema alterando o código que sempre retorna verdadeiro.

Todos 4 comentários

Obrigado por sua descrição detalhada do problema.

A segunda estratégia realmente funcionaria no IE11? Nesse caso, essa seria minha preferência.

Você gostaria de contribuir com uma solicitação pull para fazer as alterações necessárias?

Este problema foi automaticamente marcado como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

Este problema foi automaticamente marcado como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

Estou tendo o mesmo problema e encontrei a causa disso na linha 258 sinon / default-behaviours.js.

value: function value(fake, newVal) {
    var rootStub = fake.stub || fake;

    Object.defineProperty(rootStub.rootObj, rootStub.propName, {
        value: newVal,
        enumerable: true,
        configurable: isPropertyConfigurable(rootStub.rootObj, rootStub.propName)
    });

    return fake;
}

Não sei por que deveria seguir a opção configurável do objeto original. Acho que tem que ser sempre verdadeiro porque depois de stubado, ele pode ser restaurado ou reescrito (normalmente sinon.restore ()) independentemente da opção do objeto original.

Corrigi temporariamente esse problema alterando o código que sempre retorna verdadeiro.

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