2016-06-08 7 views
0

Es fällt mir schwer, bedeutungsvolle Fehler in Tests zu bekommen, wenn ich Dinge in einem Versprechen überprüfen muss.Wie erhalte ich einen aussagekräftigen Testfehler, wenn die Zusicherung ein Versprechen enthält?

Das ist, weil die meist Test-Frameworks throw verwenden, wenn eine Behauptung aus, aber die von den then Versprechungen absorbiert werden ...

Zum Beispiel in dem folgend Ich würde Mokka wie mir sagen, dass 'hello' isn‘ t gleich 'world' ...

Promise.resolve(42).then(function() { 
    "hello".should.equal("world") 
}) 

Complete fiddle here

Mit Mokka wir offiziell das Versprechen zurückbringen können, aber diese swallows completely the error und ist somit viel schlimmer ...

Hinweis: Ich verwende mocha und expect.js (wie ich mit IE8 kompatibel sein wollen)

Antwort

1

Mit Mokka wir können das Versprechen offiziell zurück, aber diese schluckt vollständig die Fehler und ist somit viel schlimmer ...

In Ihrer Geige, die Sie verwenden Mokka 1.9, die ab April 2013 datiert, und unterstützte keine Rückmeldungen aus Tests. Wenn ich deine Geige auf den neuesten Mocha aufwerte, funktioniert es gut.

+0

Sie ein Versprechen für die Auflösung zu testen zurückkehren können. Sie können beim Testen der Zurückweisung nicht einfach ein Versprechen zurückgeben, da Ihr Test fälschlicherweise bestanden wird, wenn ein Fehler in Ihrem Code vorliegt, der dazu führt, dass das Versprechen unerwartet aufgelöst wird. –

+0

Nun, was Sie hier sagen, bedeutet tautologisch zu sagen "es wird nicht richtig funktionieren, wenn Sie Ihren Code falsch schreiben". – Louis

+0

Wenn Sie nur die Promise ** -Mail- ** zurückgeben, kann Ihr Test ** ** falsch übergeben werden, wenn Sie Ihren Code falsch geschrieben haben. Dein Versprechen hat immer eine Chance zu lösen, bevor es zu den Behauptungen in deinem 'catch' kommt, wenn du auf Ablehnung testest. Tautologie oder nicht, so funktioniert es. –

0

Dies ist weniger eine Antwort eher als ein Vorschlag? Die Verwendung des before Hooks wäre hier nützlich.

describe('my promise',() => { 

    let result; 
    let err; 

    before(done => { 
    someAsync() 
     .then(res => result = res) 
     .then(done) 
     .catch(e => { 
     err = e; 
     done(); 
     }); 
    }); 

    it('should reject error',() => { 
    err.should.not.be.undefined(); // I use chai so I'm not familiar with should-esque api 
    assert.includes(err.stack, 'this particular method should throw') 
    }); 

}); 

Sie könnten auch sinon verwenden, um synchrone Mocks zu machen und dann verwenden, was should.throw Funktionalität Ihre Behauptung Bibliothek zur Verfügung stellt.

-1

eine versagende Versprechen zu testen, dies zu tun:

it('gives unusable error message - async', function(done){ 
    // Set up something that will lead to a rejected promise. 
    var test = Promise.reject(new Error('Should error')); 

    test 
    .then(function() { 
     done('Expected promise to reject'); 
    }) 
    .catch(function (err) { 
     assert.equal(err.message, 'Should error', 'should be the error I expect'); 
     done(); 
    }) 
    // Just in case we missed something. 
    .catch(done); 
}); 
+0

Sie müssen das * absolut * nicht mit Mocha machen. Gib einfach das Versprechen zurück. – Louis

+0

Sie können das Versprechen nicht einfach zurückgeben, denn wenn Ihr Code versehentlich verrechnet wird, wird Mocha denken, dass Ihr Test bestanden wird und Sie erhalten einen falschen positiven. Sie können das '.then 'oben lassen, aber ich habe es eingefügt, um zu demonstrieren, was beim Testen auf Promise-Zurückweisung schief gehen kann. –

+0

Natürlich, wenn Sie mit der unberechtigten Annahme beginnen, dass alle anderen Lösungen nicht korrekt implementiert werden können, dann funktioniert nur Ihre Lösung. – Louis