<p>sinon échoue lors de la restauration des propriétés stub dans l'objet window dans IE11</p>

Créé le 22 août 2018  ·  4Commentaires  ·  Source: sinonjs/sinon

Décrivez le bogue
il est possible de stub, mais pas de restaurer certaines propriétés dans l'objet window dans IE11, provoquant sinon une erreur de type : TypeError: Cannot redefine non-configurable property '...'

Reproduire
https://jsbin.com/qixexucasa/edit?js ,console,output - compare le comportement dans IE11 et tout autre navigateur.

"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)"

Comportement prévisible
Dans IE11 certaines propriétés de l'objet window ne sont pas configurables, mais il est toujours possible de les stub et c'est très utile dans les tests. Le comportement attendu serait l'un de ceux-ci :

  1. sinon devrait renvoyer une erreur sur l'étape stub (pas sur l'étape restore()) indiquant qu'il n'est pas possible de stub cette propriété ;
  2. lors du remplacement de la propriété, sinon il ne faut pas copier l'attribut configurable , y a-t-il une raison à cela ? Dans le cas d'une false de true :
    https://github.com/sinonjs/sinon/blob/638e104d1e6ed9908c1b09bd33d2cba1aa8c217a/lib/sinon/default-behaviors.js#L251

Le contexte:

  • Version bibliothèque : toutes les versions sont concernées, testées en 4.4.6 & 6.1.5.

Veuillez confirmer s'il s'agit d'un bug ou d'un comportement attendu.

Bug Help wanted hacktoberfest pinned

Commentaire le plus utile

J'ai le même problème et j'en ai trouvé la cause sur la ligne 258 sinon/default-behaviors.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;
}

Je ne sais pas pourquoi il devrait suivre l'option configurable de l'objet d'origine. Je pense que cela doit toujours être vrai car après avoir été stubé, il peut être restauré ou réécrit (généralement sinon.restore()) quelle que soit l'option de l'objet d'origine.

Temporairement, j'ai résolu ce problème en modifiant ce code qui renvoie toujours true.

Tous les 4 commentaires

Merci pour votre description détaillée du problème.

Est-ce que cela fonctionnerait avec la deuxième stratégie dans IE11 ? Si oui, ce serait ma préférence.

Seriez-vous prêt à contribuer à une pull request pour apporter les modifications nécessaires ?

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

Ce problème a été automatiquement marqué comme obsolète car il n'a pas eu d'activité récente. Il sera fermé si aucune autre activité ne se produit. Merci pour vos contributions.

J'ai le même problème et j'en ai trouvé la cause sur la ligne 258 sinon/default-behaviors.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;
}

Je ne sais pas pourquoi il devrait suivre l'option configurable de l'objet d'origine. Je pense que cela doit toujours être vrai car après avoir été stubé, il peut être restauré ou réécrit (généralement sinon.restore()) quelle que soit l'option de l'objet d'origine.

Temporairement, j'ai résolu ce problème en modifiant ce code qui renvoie toujours true.

Cette page vous a été utile?
0 / 5 - 0 notes