2015-09-05 5 views
2

Je sinon voudrais tester ma promesse gestionnaire de détermination et promettre gestionnaire de rejet à l'aide mocha, chai et sinon .En outre, j'ai le plugin sinon-chai et sinon-stub-promise plug-in mis en place.Testing promet avec mocha et chaï

Ceci est mon bloc d'instructions nécessitent:

var chai = require('chai'); 
var expect = chai.expect; 
var sinonChai = require('sinon-chai'); 
chai.use(sinonChai); 
var sinon = require('sinon'); 
var sinonStubPromise = require('sinon-stub-promise'); 
sinonStubPromise(sinon); 

Ceci est mon suite de tests:

describe('Connect to github users',function(done){ 

    var api = require('../users'), 
     onSuccess = api.onSuccess, 
     onError = api.onReject; 
    console.dir(api); 
    //the idea is not to test the async connection,the idea is to test 
    //async connection but to test how the results are handled. 
    var resolveHandler, 
     rejectHandler, 
     getPromise, 
     result; 

    beforeEach(function(){ 
     resolveHandler = sinon.spy(onSuccess); 
     rejectHandler = sinon.spy(onError); 
     getPromise = sinon.stub().returnsPromise(); 
    }); 

    it('must obtain the result when promise is successful',function(){ 
     result = [...];//is an actual JSON array  
     getPromise.resolves(result); 

     getPromise() 
      .then(resolveHandler) 
      .catch(rejectHandler); 

     expect(resolveHandler).to.have.been.called();//error 
     expect(resolveHandler).to.have.returned(result); 
     expect(rejectHandler).to.have.not.been.called();  
     done(); 
    }); 

    afterEach(function(){ 
     resolveHandler.reset(); 
     rejectHandler.reset(); 
     getPromise.restore(); 
    }); 

}); 

je me retrouve à obtenir cette erreur:

Connect to github users must obtain the result when promise is successful: 
TypeError: expect(...).to.have.been.called.toEqual is not a function 
    at Context.<anonymous> (C:\Users\vamsi\Do\testing_promises\test\githubUsersSpec.js:94:46) 
+0

Les promesses bloquées sont-elles synchrones? – Bergi

+0

L'implémentation est 'thenable' qui peut être chaînée avec tout ce qui a' then' incluant une promesse réelle * que je ne voudrais pas faire, donc j'utilise les 'resolves' et' rejects' pour tester un gestionnaire seulement. J'ai essayé ceci après avoir regardé [cette vidéo] (https://youtu.be/HHcEjAQ46Io?t=2213) où il capture des arguments à jQuery ajax callback de succès, – vamsiampolu

+0

Ouais, je me demandais juste que vous vous attendiez à ce que les gestionnaires aient été appelés à droite après les avoir attachés. Les promesses normales échoueraient. – Bergi

Répondre

-1

Cette ligne de code c'est faux:

expect(resolveHandler).to.have.been.called(); 

called est juste une propriété sur la spy dont la valeur est toujours un boolean et peut être tout simplement testé à l'aide chai comme ceci:

expect(resolveHandler.called).to.equal(true); 

De même au lieu de cette ligne pour confirmer que la fonction n'a pas rejeté:

expect(rejectHandler).to.have.not.been.called(); 

utiliser avec called comme une propriété:

expect(rejectHandler.called).to.equal(false); 
+1

Le code n'est pas faux, il essaie d'utiliser 'sinon-chai' et donc' to.have.been.called' est un code valide. –

0

Le forfait sinon-with-promise convient parfaitement à ce que vous essayez de faire. J'ai rencontré le même problème (sauf que je n'avais pas besoin de tester les cas de rejet) et ça a bien fonctionné.