मेरे पास निम्नलिखित ईएस 6 मॉड्यूल हैं:
network.js
export function getDataFromServer() {
return ...
}
widget.js
import { getDataFromServer } from 'network.js';
export class Widget() {
constructor() {
getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
render() {
...
}
}
मैं एक नकली उदाहरण के साथ विजेट का परीक्षण करने के लिए एक रास्ता देख रहा हूँ getDataFromServer
। अगर मैं <script>
कर्म में ईएस 6 मॉड्यूल के बजाय अलग-अलग एस का उपयोग करता हूं, तो मैं अपना परीक्षण लिख सकता हूं जैसे:
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(window, "getDataFromServer").andReturn("mockData")
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
हालांकि, अगर मैं एक ब्राउज़र के बाहर व्यक्तिगत रूप से ईएस 6 मॉड्यूल का परीक्षण कर रहा हूं (जैसे कि मोचा + बाबेल के साथ), मैं कुछ इस तरह लिखूंगा:
import { Widget } from 'widget.js';
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(?????) // How to mock?
.andReturn("mockData")
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
ठीक है, लेकिन अब (अच्छी तरह से, वहाँ getDataFromServer
बिल्कुल नहीं है) में उपलब्ध नहीं है , और मैं सीधे खुद के दायरे में सामान इंजेक्ट करने का एक तरीका नहीं जानता ।window
window
widget.js
अब मुझे यहां से कहां जाना है?
- क्या इसके दायरे को एक्सेस करने का कोई तरीका है
widget.js
, या कम से कम इसके आयात को मेरे स्वयं के कोड से बदल दिया जाए? - यदि नहीं, तो मैं
Widget
परीक्षण योग्य कैसे बना सकता हूं ?
सामान मैंने माना:
ए। मैनुअल निर्भरता इंजेक्शन।
सभी आयातों को निकालें widget.js
और कॉल करने वाले से डिप्स प्रदान करने की अपेक्षा करें।
export class Widget() {
constructor(deps) {
deps.getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
}
मैं इस तरह से विजेट के सार्वजनिक इंटरफ़ेस को गड़बड़ाने और कार्यान्वयन विवरण को उजागर करने के साथ बहुत असहज हूं। नही जाओ।
ख। आयात को बेनकाब करने की अनुमति दें।
कुछ इस तरह:
import { getDataFromServer } from 'network.js';
export let deps = {
getDataFromServer
};
export class Widget() {
constructor() {
deps.getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
}
फिर:
import { Widget, deps } from 'widget.js';
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(deps.getDataFromServer) // !
.andReturn("mockData");
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
यह कम आक्रामक है लेकिन मुझे प्रत्येक मॉड्यूल के लिए बहुत सारे बॉयलरप्लेट लिखने की आवश्यकता है, और हर समय के getDataFromServer
बजाय मेरे उपयोग का जोखिम अभी भी है deps.getDataFromServer
। मैं इसे लेकर असहज हूं, लेकिन यह मेरा अब तक का सबसे अच्छा विचार है।
createSpy
( github.com/jasmine/jasmine/blob/… ) फ़ंक्शन का उपयोग करने का प्रयास करूँगा । ताकि, विजेट की परीक्षण फ़ाइल में आप getDataFromServer आयात करेंगे, और फिरlet spy = createSpy('getDataFromServer', getDataFromServer)
spyOn
उस वस्तु पर, network.js
मॉड्यूल से आयात कर सकते हैं । यह हमेशा उसी वस्तु का संदर्भ होता है।
Widget
सार्वजनिक इंटरफ़ेस को कैसे गड़बड़ कर देता है? बिनाWidget
गड़बड़ है । निर्भरता को स्पष्ट क्यों नहीं किया जाता है? deps