2015-10-01 1 views
2

J'ai une méthode qui peut provoquer une Erreur, mais j'ai du mal à écrire un scénario de test SinonJS/Mocha/Should pour cette condition.Attraper des erreurs lancées avec SinonJS

fonction de l'échantillon testé:

function testError(value) { 
    if (!value) { 
    throw new Error('No value'); 
    return false; 
    } 
}; 

test de l'échantillon:

describe('#testError', function() { 
    it('throws an error', function() { 
    var spy = sinon.spy(testError); 
    testError(false); 
    spy.threw().should.be.true(); 
    }); 
}); 

Ce sorties:

#testError 
    1) throws an error 


    0 passing (11ms) 
    1 failing 

    1) #testError throws an error: 
    Error: No value 
     at testError (tests/unit/js/test-error.js:6:14) 
     at Context.<anonymous> (tests/unit/js/test-error.js:14:6) 

Je me attendais Sinon pour attraper l'erreur et me permettre d'espionner le lancer, mais il semble échouer le test à la place. Des idées? J'ai fait référence à Don't sinon.js spys catch errors? mais la seule solution est d'utiliser expect. Je préférerais garder une seule bibliothèque d'assertions si possible.

Répondre

8

Il semble que cela fonctionne dans un try/catch:

function foo() { throw new Error("hey!"); } 
var fooSpy = sinon.spy(foo); 
try { 
    fooSpy(); 
} catch (e) { 
    // pass 
} 
assert(fooSpy.threw()); 

Notez que vous devez appeler fooSpy, pasfoo lui-même.

Mais notez aussi que .should.be.true() est pas partie de Sinon, vous êtes probablement déjà en utilisant Chai ou une bibliothèque similaire, auquel cas la syntaxe expect(foo).to.have.thrown() ou assert.throws(foo, someError) semble beaucoup plus agréable.

Mise à jour: Si vous utilisez ShouldJS, vous pouvez utiliser should.throws. Je pense toujours que c'est plus agréable que d'utiliser la version Sinon dans ce but.

+1

Merci, @nrabinowitz. On dirait que '' 'should.throws''' pourrait être le ticket. Voir ma réponse révisée ci-dessous. – benjarwar

3

révisée

Après des conseils utiles de @ nrabinowitz, voici une solution qui utilise should.throws. Cela évite d'utiliser complètement Sinon.spy.

describe('#testError', function() { 
    it('throws an error', function() { 
    should.throws(function() { 
     testError(false); 
    }); 
    }); 
}); 
+1

Cela ne fait pas ce que vous pensez. 'stub.throws()' est un comportement de pré-programmation pour le stub, sans affirmer qu'il a été appelé. Les stubs n'appellent pas * la fonction sous-jacente - essayez ceci avec une autre fonction qui ne lance pas, et vous verrez le comportement inchangé. – nrabinowitz

+0

Ah, vous avez raison. L'utilisation de '' 'stub''' était un faux positif. Je pense en utilisant '' 'should.throws''' et en appelant la fonction réelle sous test fonctionne. Et évite d'utiliser Sinon entièrement. Voir ma réponse révisée. – benjarwar