2017-03-10 4 views
1

Ich habe eine ES6/Aurelia App, die ich mit Jasmin zu testen. Die Methode, die ich zu testen, ich versuche, sieht etwa so aus:Unit Test Logik innerhalb Versprechen Callback

update() { 
    let vm = this; 
    vm.getData() 
     .then((response) => { 
      vm.processData(response); 
     }); 
} 

Wo this.getData ist eine Funktion, die ein Versprechen zurückgibt.

Meine Spec-Datei sieht ungefähr so ​​aus:

describe('my service update function',() => { 
    it('it will call the other functions',() => { 
     myService = new MyService(); 
     spyOn(myService, 'getData').and.callFake(function() { 
      return new Promise((resolve) => { resolve(); }); 
     }); 
     spyOn(myService, 'processData').and.callFake(function() { return; }); 
     myService.update(); 

     // this one passes 
     expect(myService.getData).toHaveBeenCalled(); 

     // this one fails 
     expect(myService.processData).toHaveBeenCalled(); 
    }); 
}); 

Ich verstehe, warum dies nicht gelingt - Versprechen sind asynchron und es wurde von der Zeit nicht gelöst es das erwarten trifft.

Wie kann ich die Versprechungen aus meinem Test lösen, damit ich den Code innerhalb des Rückrufs testen kann?

jsfiddle gescheiterter Test: http://jsfiddle.net/yammerade/2aap5u37/6/

Antwort

3

bekam ich eine Abhilfe ausgeführt wird, indem ein Objekt zurückkehrt, das wie ein Versprechen anstelle eines tatsächlichen Versprechen

describe('my service update function',() => { 
    it('it will call the other functions',() => { 
     myService = new MyService(); 
     spyOn(myService, 'getData').and.returnValue({ 
      then(callback) { 
       callback(); 
      } 
     }); 
     spyOn(myService, 'processData').and.callFake(function() { return; }); 
     myService.update(); 

     // this one passes 
     expect(myService.getData).toHaveBeenCalled(); 

     // this one fails 
     expect(myService.processData).toHaveBeenCalled(); 
    }); 
}); 

Fiddle hier verhält: http://jsfiddle.net/yammerade/9rLrzszm/2/

Ist etwas falsch damit, es so zu machen?

0
it((done) => { 
    // call done, when you are done 
    spyOn(myService, 'processData').and.callFake(function() { 
    expect(myService.processData).toHaveBeenCalled(); 

    done(); 
    }); 
}) 
+0

Ich habe versucht, es nach dem 'myService.update()' Anruf hinzufügen, aber die zweite erwartet noch immer fehlschlägt. Lege ich es an den falschen Ort? – yammerade

+0

erwarten Sie nach dem Aufruf von processData einen Testfall? Also, setz es hier auf die spotted Funktion –

+0

Immer noch nicht für mich arbeiten. – yammerade

Verwandte Themen