2017-05-09 5 views
0

voulu comprendre comment écrire test pour le scénario suivant avec des promessesComment tester le scénario de promesse avec sinon et mocha

Note: le code ci-dessous est le code pseudo

class Service{ 
    get(){ 
    return Promise.resolve('hi'); 
    } 
} 

class otherObj{ 
    trigger(a){ 
    console.log(a); 
    } 
} 

class Caller{ 
    getData(){ 
    new Service() 
     .get() 
     .then((a)=>{console.log('in resolve') otherObj.trigger(a)}, 
      (r)=>{console.log('in reject') otherObj.trigger(r)} 
      ) 
    } 
} 

Lors de l'écriture test, je compris que même après avoir écrasé l'appel Service.get() pour renvoyer les journaux de la console de promesse résolue à l'intérieur, il n'est pas appelé. Comment tester un scénario comme celui-ci?

descibe('test',()=>{ 
    it('test resolve',()=>{ 
    let stub = stub(Service.prototype, 'get').returns(Promise.resove('hi')) 
    new Caller().getData();  
    stub.restore(); 
    }) 
    it('test reject',()=>{ 
    let stub = stub(Service.prototype, 'get').returns(Promise.reject('error')) 
    new Caller().getData(); 
    stub.restore(); 
    }) 
}) 
+0

Vous devez retourner la promesse créée dans 'getData' – Troopers

Répondre

1

J'ai refaçonné un peu votre code pour qu'il réussisse les tests.

'use strict'; 

const chai = require('chai'); 
const sinon = require('sinon'); 
const SinonChai = require('sinon-chai'); 

chai.use(SinonChai); 
chai.should(); 

class Service { 
    get() { 
    return Promise.resolve('hi'); 
    } 
} 

class OtherObj { 

    constructor() { 

    } 

    trigger(a) { 
    console.log(a); 
    } 
} 

class Caller { 

    constructor(){ 
    this.otherObj = new OtherObj(); 
    } 

    getData() { 
    new Service() 
     .get() 
     .then((a) => { 
     console.log('in resolve'); 
     this.otherObj.trigger(a); 
     }).catch((e) => { 
     console.log('in reject'); 
     this.otherObj.trigger(e); 
     }); 
    } 
} 


context('test', function() { 

    beforeEach(() => { 
    if (!this.sandbox) { 
     this.sandbox = sinon.sandbox.create(); 
    } else { 
     this.sandbox.restore(); 
    } 
    }); 

    it('test resolve',() => { 
    this.sandbox.stub(Service.prototype, 'get').returns(Promise.resolve('hi')); 
    new Caller().getData(); 

    }); 

    it('test reject',() => { 
    this.sandbox.stub(Service.prototype, 'get').returns(Promise.reject('error')); 
    new Caller().getData(); 

    }); 

}); 

Il y avait quelques erreurs dans votre extrait qui l'empêchait de fonctionner correctement. La façon dont vous avez géré le chaînage de la promesse Service() était erronée. Au lieu de cela

new Service() 
     .get() 
     .then((a)=>{console.log('in resolve') otherObj.trigger(a)}, 
      (r)=>{console.log('in reject') otherObj.trigger(r)} 
      ) 

vous auriez dû aller pour que

new Service() 
     .get() 
     .then((a) => { 
     console.log('in resolve'); 
     this.otherObj.trigger(a); 
     }).catch((e) => { 
     console.log('in reject'); 
     this.otherObj.trigger(e.message); 
     }); 

qui gère à la fois heureux et triste chemin. Dans votre version, vous n'avez jamais détecté l'exception lancée par le talon dans le second test.

+1

la promesse de test semble encore difficile en essayant d'obtenir plus de ressources merci pour la réponse –