2015-09-10 8 views
0

J'utilise Mocha, Chai et Sinon pour tester mon code Angular.Test pour s'assurer qu'une fonction dans une promesse dans une fonction est appelée?

J'ai un code dans une fonction appelée mise à jour je dois tester

function update() 
//... Irrelevant code to the question asked 
     DataService.getEventsData(query).then(function (res) { 


      var x = res.results; 
      addTabletoScope(x); // Want to check that this is called. 
      vm.tableState.pagination.numberOfPages = Math.ceil(res.resultsFound/vm.tableState.pagination.number); 


      vm.isLoading = false; 


      vm.count++; 

     }); 

Tout ce code est dans la fonction de mise à jour. Tout cela est dans un contrôleur que je suis en train de tester.

Lorsque j'appelle scope.update() dans mon test, je veux m'assurer que le scope.addTabletoScope (x) est appelé.

dans un beforeeach avant d'exécuter les essais, j'ai un espion

spy = sinon.spy(scope, 'addTabletoScope'); 

Parce que cette fonction est liée à la portée.

Voici un test que j'ai exécuté.

it('Expects adding to scope to be called', function(){ 
     $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL) 
      .respond(res.data); 
     scope.tableState = tableState; 
     scope.update(); 
     $httpBackend.flush(); 
     expect(spy.called).to.be.true; 
    }) 

Échec car spy.called est faux.

Une autre chose que j'ai essayé était

it('Expects adding to scope to be called', function(){ 
     $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL) 
      .respond(res.data); 
     scope.tableState = tableState; 
     scope.update(); 
     scope.$apply(); 
     $httpBackend.flush(); 
     expect(spy.called).to.be.true; 
    }) 

Ce qui ne fonctionne pas non plus. Où vais-je me tromper avec ça?

Répondre

0

Je l'ai compris rapidement après avoir regardé les documents MochaJS.

Si je fonctionne avec des promesses ou tout comportement async, après que j'appelle la fonction qui montre que le comportement, je passerais le paramètre fait à la fonction anonyme dans ce test, puis faire appel à fait comme ceci:

it('Expects adding to scope to be called', function(done){ 
     $httpBackend.whenPOST(APP_SETTINGS.GODZILLA_EVENTS_URL) 
      .respond(res.data); 
     scope.tableState = tableState; 
     scope.update(); 
     done(); 
     $httpBackend.flush(); 
     expect(spy.called).to.be.true; 
    }) 

Cela fonctionne.