2016-06-22 6 views
3

Ich habe diese Funktion zu erwarten:Jasmin: Wie Versprechen Handler nicht werfen Ausnahme

reload() { 
    myService.queryData() 
     .done(...) 
     .always(() => throw "fake exception"); //just to simulate the failure 
} 

Ich möchte, dass meine Test Nachlegefunktion und stellen Sie sicher, dass es nicht Ausnahme wirft noch das Versprechen Rückruf tut.

describe("reload", function() { 
    it("does not throw exception", function (done) { 

     spyOn(myService, "queryData").and.callFake(() => { 
      let deffered = $.deffered(); 
      setTimeOut(() => deffered.reject(), 0) 
      return deffered.promise(); 
     }); 

     reload(); 
     setTimeout(() => { 
      //this is evaluated after the exception has been thrown, but 
      //how to check whether exception has been thrown 
     }, 2); 
    }); 
}); 

EDIT: Ich könnte nicht ein Versprechen in einigen Fällen zurückkehren kann, wo der Rückgabetyp der Funktion ist bereits definiert, Lifecycle-Veranstaltung zB Komponente:

MyComponent extends React.Component { 
    componentDidMount() { 
     this.load(
      galleryService.nodes().then(galleryResult => this.setState({ nodes: galleryResult.nodes })) 
     ); 
     this.load(
      galleryService.caches().then(cachesResult => this.setState({ caches: cachesResult.caches })) 
     ); 
    } 
} 

var myComponent = React.createElement(MyComponent); 
TestUtils.renderIntoDocument(myComponent); //this triggers the componentDidMount event and I need to make sure it won't throw error. 
+0

können Sie nicht verwenden 'Promise.all' oder' Promise.race' den Fluss in Ihrem bearbeiten Snippet zu koordinieren? – MarcoL

+0

Ich könnte, aber ComponentDidMount wird durch das Framework (REACT) als Funktion definiert, die void zurückgibt und ich nicht direkt aufrufen. Es wird vom Framework aufgerufen, wenn ich 'TestUtils.renderIntoDocument (...)' ausführe. Ich hatte gehofft, dass ich das Problem zu Vanillejavascript isolieren kann, aber ich habe gescheitert, das Problem richtig zu formulieren ... – Liero

+0

Ich sehe noch nicht, warum Sie eine 'Promise.all' nicht zurückgeben können, die alle Ihre Versprechen von' componentDidMount enthält 'oder faktorieren Sie den relevanten Code in eine separate, testbare Funktion, die Sie von' componentDidMount' aufrufen. –

Antwort

0

Ich glaube, dass auf window.onerror Ausspionieren der Weg zu gehen ist:

describe("reload", function() { 
    it("does not throw an exception", function (done) { 

      spyOn(window, 'onerror').and.callFake((error: any, e: any) => { 
       fail(error); 
      }); 

      spyOn(myService, "queryData").and.callFake(() => { 
       let deffered = $.deffered(); 
       setTimeout(deffered.reject, 0); 
       return deffered.promise(); 
      }); 
     }); 
     setTimeout(done, 2); 
    }); 
}); 
3

Let reload das Versprechen zurückzukehren es erstellt. In Ihrem Testfall, fügen Sie eine catch Handler es, die einen Testfehler auslöst:

reload().catch(err => done.fail(err)); 

Update nach Frage bearbeitet wurde: Wenn Sie nicht den Rückgabewert Ihrer ursprünglichen Funktion ändern können dann die relevanten Teile ausklammern in getrennte Funktionen. Zum Beispiel:

function reloadNodes() { 
    return somePromise(); 
} 

function reloadCaches() { 
    return anotherPromise(); 
} 

function reload() { 
    reloadNodes(); 
    reloadCaches(); 
} 

können Sie dann testen reloadNodes und reloadCaches statt reload. Offensichtlich müssen Sie keine separate Funktion für jedes Versprechen erstellen, sondern kombinieren Sie Ihre Versprechen mit etwas wie Promise.all, wo angemessen.

+0

Das ist die Art, wie ich es gemacht habe, aber es ist nicht immer möglich, ein Versprechen zurückzugeben, siehe meine Bearbeitung. – Liero

+0

@Liero Siehe mein Update –

+0

Ich werde dies als Antwort später akzeptieren, da es meine ursprüngliche Frage beantwortet, aber es löst nicht wirklich mein Problem. Ich gebe zu, ich habe es schlecht beschrieben – Liero