2017-06-23 1 views
2

J'ai une erreur lors du test avec sinon.js (et mocha). L'erreur se produit lorsque j'exécute tous les scripts de test via npm, mais pas lorsque j'exécute un script individuel via l'EDI. L'exécution du script de test fonctionne correctement et le test est réussi.Sinon TypeError: Tentative d'envelopper <method> qui est déjà encapsulé lors de l'exécution de plusieurs scripts

I.e. J'ai un répertoire avec plusieurs scripts de test. Quand je lance un script seul, les tests passent. Quand je lance tous les scripts dans le répertoire TESS échouer avec les erreurs:

test échouera avec

TypeError: Attempted to wrap getVariable which is already wrapped 

Alors que les autres tests échouent avec:

TypeError: Cannot read property 'restore' of undefined 

Les deux scripts de test commencent par le même code:

const 
    assert = require('assert'), 
    sinon = require('sinon'); 

global.context = { 
    getVariable: function(s) {} 
}; 

var contextGetVariableMethod; 

beforeEach(function() { 
    contextGetVariableMethod = sinon.stub(context, 'getVariable'); 
}); 

afterEach(function() { 
    contextGetVariableMethod.restore(); 
}); 

Je suppose que moka exécute les deux tests simultanément? Et les tests interfèrent les uns avec les autres. Je suis confus pourquoi la portée des tests n'est pas indépendante si ... peut-être son utilisation de global?

grâce

Répondre

1

Selon la documentation Sinon JS, si vous avez var stub = sinon.stub(object, "method");
vous devez restaurer avec object.method.restore();

Ainsi, dans votre cas:

afterEach(function() { 
    context.getVariable.restore() 
}); 
0

Je pense avoir réussi pour semer le problème. La solution qui fonctionne pour moi est de redéclairer les objets en train d'être talonnés dans la méthode beforeEach.

par exemple:

const 
    assert = require('assert'), 
    sinon = require('sinon'); 

var contextGetVariableMethod; 

beforeEach(function() { 
    global.context = { 
    getVariable: function(s) {} 
    }; 
    contextGetVariableMethod = sinon.stub(context, 'getVariable'); 
}); 

afterEach(function() { 
    contextGetVariableMethod.restore(); 
}); 

Pas tout à fait sûr pourquoi cela fonctionne, mais la structuration du code comme cela semble avoir résolu le problème