আমার নিম্নলিখিত ES6 মডিউল রয়েছে:
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>কর্মের মতো ES6 মডিউলগুলির পরিবর্তে পৃথক গুলি ব্যবহার করি, তবে আমি আমার পরীক্ষার মতো লিখতে পারতাম:
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();
});
});
তবে, যদি আমি ব্রাউজারের বাইরে পৃথকভাবে ES6 মডিউলগুলি পরীক্ষা করে নিই (যেমন মোচা + বাবেলের মতো) তবে আমি এই জাতীয় কিছু লিখব:
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 । নির্ভরতা সুস্পষ্ট করে তোলেন না কেন?