जैस्मीन: वादा हैंडलर को अपवाद नहीं फेंकने की उम्मीद कैसे करें - जावास्क्रिप्ट, जैस्मीन, ईएस 6-वादा

मेरे पास यह कार्य है:

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

मैं अपना टेस्ट रीलोड फ़ंक्शन चाहता हूं और सुनिश्चित करता हूं कि यह अपवाद नहीं फेंकता है और न ही वादा कॉलबैक करता है।

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);
});
});

संपादित करें: मैं कुछ मामलों में एक वादा वापस नहीं कर पाऊंगा, जहां फ़ंक्शन का रिटर्न प्रकार पहले ही परिभाषित किया गया है, उदाहरण के लिए घटक का जीवन चक्र घटना:

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.

उत्तर:

जवाब के लिए 3 № 1

चलो reload यह वादा करता है कि यह बनाता है। अपने परीक्षण मामले में, एक संलग्न करें catch इसके लिए हैंडलर जो परीक्षण विफलता को ट्रिगर करता है:

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

प्रश्न संपादित करने के बाद अद्यतन किया गया था: यदि आप अपने मूल कार्य के वापसी मूल्य को नहीं बदल सकते हैं तो प्रासंगिक भागों को अलग-अलग कार्यों में कारक बनाएं। उदाहरण के लिए:

function reloadNodes() {
return somePromise();
}

function reloadCaches() {
return anotherPromise();
}

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

फिर आप परीक्षण कर सकते हैं reloadNodes तथा reloadCaches के बजाय reload। जाहिर है कि आपको प्रत्येक वादे के लिए एक अलग कार्य करने की आवश्यकता नहीं है, बल्कि कुछ ऐसा करने के बजाय अपने वादों को गठबंधन करें Promise.all जहां उपयुक्त हो।


जवाब के लिए 0 № 2

मुझे विश्वास है कि जासूसी कर रहा है window.onerror जाने का रास्ता है:

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);
});
});

संबंधित सवाल
सबसे लोकप्रिय