উত্তর:
@ সিডো থেকে দুর্দান্ত সমাধান
যাইহোক, আমরা ES2015 বাক্য গঠন ব্যবহার করেছি এবং আমি অনুভব করেছি যে এটি এইভাবে লিখতে এটি কিছুটা পরিষ্কার।
class LocalStorageMock {
constructor() {
this.store = {};
}
clear() {
this.store = {};
}
getItem(key) {
return this.store[key] || null;
}
setItem(key, value) {
this.store[key] = value.toString();
}
removeItem(key) {
delete this.store[key];
}
};
global.localStorage = new LocalStorageMock;
|| null
সে কারণেই আমার পরীক্ষাটি ব্যর্থ হয়েছিল, কারণ আমার পরীক্ষায় আমি ব্যবহার করছিলাম not.toBeDefined()
। @ শেইদো সমাধান আবার এটি কাজ করে
এটির সাহায্যে এটি চিত্রিত করেছেন: https://groups.google.com/forum/#!topic/jestjs/9EPhuNWVYTg
নিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল সেটআপ করুন:
var localStorageMock = (function() {
var store = {};
return {
getItem: function(key) {
return store[key];
},
setItem: function(key, value) {
store[key] = value.toString();
},
clear: function() {
store = {};
},
removeItem: function(key) {
delete store[key];
}
};
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });
তারপরে আপনি আপনার জেস্ট কনফিগারেশনের অধীনে আপনার প্যাকেজ.জসনে নিম্নলিখিত লাইনটি যুক্ত করুন
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
"setupFiles": [...]
পাশাপাশি কাজ করে। অ্যারে বিকল্পের সাহায্যে মককে পৃথক ফাইলে আলাদা করার অনুমতি দেয়। উদাহরণস্বরূপ:"setupFiles": ["<rootDir>/__mocks__/localStorageMock.js"]
getItem
যদি কোনও নির্দিষ্ট কীটির সাথে কোনও ডেটা সেট না করা হয় তবে কোনও ব্রাউজার দ্বারা কী ফিরিয়ে দেওয়া হবে তার ফেরতের মানটি কিছুটা পৃথক হয় । getItem("foo")
সেট না করা হলে কল করা উদাহরণস্বরূপ null
একটি ব্রাউজারে ফিরে আসবে , তবে undefined
এই মক দ্বারা - এটি আমার পরীক্ষাগুলির একটিতে ব্যর্থ হয়ে পড়েছিল। আমার জন্য সহজ সমাধান আসতে ছিল store[key] || null
মধ্যে getItem
ফাংশন
localStorage['test'] = '123'; localStorage.getItem('test')
যদি ক্রিয়েট-রিএ্যাক্ট-অ্যাপ ব্যবহার করা হয় তবে ডকুমেন্টেশনে একটি সহজ এবং সরল সমাধান ব্যাখ্যা করা আছে ।
এটি তৈরি করুন src/setupTests.js
এবং এতে রাখুন:
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
clear: jest.fn()
};
global.localStorage = localStorageMock;
নীচে একটি মন্তব্যে টম মার্টজ অবদান:
এরপরে আপনি পরীক্ষা করতে পারেন যে আপনার লোকালস্টোরেশনমকের ফাংশনগুলি এমন কিছু করে ব্যবহার করা হয়
expect(localStorage.getItem).toBeCalledWith('token')
// or
expect(localStorage.getItem.mock.calls.length).toBe(1)
আপনার পরীক্ষাগুলির ভিতরে যদি আপনি নিশ্চিত করতে চান যে এটি বলা হয়েছিল। পরীক্ষা করে দেখুন https://facebook.github.io/jest/docs/en/mock-functions.html
localStorage
। (যদি আপনি ব্যবহার করেন create-react-app
এবং সমস্ত স্বয়ংক্রিয় স্ক্রিপ্টগুলি এটি প্রাকৃতিকভাবে সরবরাহ করে)
expect(localStorage.getItem).toBeCalledWith('token')
বা এর expect(localStorage.getItem.mock.calls.length).toBe(1)
ভিতরে যেমন কিছু করা হয়েছে তা নিশ্চিত করতে চাইলে এটি ব্যবহার করা হয়েছিল। পরীক্ষা করে দেখুন facebook.github.io/jest/docs/en/mock-functions.html
localStorage
? "স্পিলওভার "টিকে অন্য পরীক্ষায় রোধ করতে আপনি কি প্রতিটি পরীক্ষার পরে গুপ্তচরদের পুনরায় সেট করতে চান না?
বর্তমানে (অক্টোবর '19) লোকাল স্টোরেজটি আপনি সাধারণত যেমন করতেন তেমন এবং রস-প্রতিক্রিয়া-অ্যাপ্লিকেশন ডক্সে বর্ণিত হিসাবে ঠাট্টা করে বা ঠাট্টা করা যায় না। এটি jsdom এ পরিবর্তনগুলির কারণে। আপনি এটি সম্পর্কে রসিকতা এবং জাসডম ইস্যু ট্র্যাকারগুলিতে পড়তে পারেন ।
কার্যকারণ হিসাবে, আপনি পরিবর্তে প্রোটোটাইপ গুপ্তচর করতে পারেন:
// does not work:
jest.spyOn(localStorage, "setItem");
localStorage.setItem = jest.fn();
// works:
jest.spyOn(window.localStorage.__proto__, 'setItem');
window.localStorage.__proto__.setItem = jest.fn();
// assertions as usual:
expect(localStorage.setItem).toHaveBeenCalled();
jest.spyOn(window.localStorage.__proto__, 'setItem');
অথবা আপনি ঠিক এইভাবে একটি মক প্যাকেজ নিন:
https://www.npmjs.com/package/jest-localstorage-mock
এটি কেবলমাত্র স্টোরেজ কার্যকারিতা পরিচালনা করে না তবে এটি আপনাকে স্টোরকে ডাকা হয়েছিল কিনা তা পরীক্ষা করতে দেয়।
একটি ভাল বিকল্প যা undefined
মানগুলি পরিচালনা করে (এটিতে নেই toString()
) এবং null
মান উপস্থিত না থাকলে ফিরে আসে । এটি react
v15 দিয়ে পরীক্ষা করেছেন , redux
এবংredux-auth-wrapper
class LocalStorageMock {
constructor() {
this.store = {}
}
clear() {
this.store = {}
}
getItem(key) {
return this.store[key] || null
}
setItem(key, value) {
this.store[key] = value
}
removeItem(key) {
delete this.store[key]
}
}
global.localStorage = new LocalStorageMock
removeItem
: ডেভেলপার.মোজিলা.আর.ইন.ইউএস
যদি আপনি কোনও উপহাসের জন্য এবং না খোদাইয়ের সন্ধান করেন তবে আমি যে সমাধানটি ব্যবহার করি তা এখানে:
export const localStorageMock = {
getItem: jest.fn().mockImplementation(key => localStorageItems[key]),
setItem: jest.fn().mockImplementation((key, value) => {
localStorageItems[key] = value;
}),
clear: jest.fn().mockImplementation(() => {
localStorageItems = {};
}),
removeItem: jest.fn().mockImplementation((key) => {
localStorageItems[key] = undefined;
}),
};
export let localStorageItems = {}; // eslint-disable-line import/no-mutable-exports
আমি সহজ আরম্ভের জন্য সঞ্চয়স্থান আইটেম রফতানি করি। IE আমি সহজেই এটি কোনও বস্তুতে সেট করতে পারি
জেস্ট + জেএসডমের নতুন সংস্করণগুলিতে এটি সেট করা সম্ভব নয় তবে লোকালস্টোরেজ ইতিমধ্যে উপলব্ধ এবং আপনি এটির জন্য এটি গুপ্তচর রাখতে পারেন:
const setItemSpy = jest.spyOn(Object.getPrototypeOf(window.localStorage), 'setItem');
আমি গিথুব থেকে এই সমাধানটি পেয়েছি
var localStorageMock = (function() {
var store = {};
return {
getItem: function(key) {
return store[key] || null;
},
setItem: function(key, value) {
store[key] = value.toString();
},
clear: function() {
store = {};
}
};
})();
Object.defineProperty(window, 'localStorage', {
value: localStorageMock
});
আপনি আপনার সেটআপ টেস্টে এই কোডটি sertোকাতে পারেন এবং এটি ঠিকঠাক কাজ করা উচিত।
আমি টাইপসিটিপ্ট সহ একটি প্রকল্পে এটি পরীক্ষা করেছি।
দুর্ভাগ্যক্রমে, আমি যে সমাধানগুলি এখানে পেয়েছি সেগুলি আমার পক্ষে কার্যকর হয়নি।
তাই আমি জেস্ট গিটহব ইস্যুগুলির দিকে তাকিয়ে এই থ্রেডটি পেয়েছি
সর্বাধিক উত্সাহিত সমাধানগুলি হ'ল:
const spy = jest.spyOn(Storage.prototype, 'setItem');
// or
Storage.prototype.getItem = jest.fn(() => 'bla');
window
বা Storage
সংজ্ঞাও নেই। সম্ভবত এটি আমি ব্যবহার করছি জাস্টের পুরানো সংস্করণ।
@ সি কে 4 হিসাবে প্রস্তাবিত ডকুমেন্টেশনের ঠাট্টায় ব্যবহারের জন্য স্পষ্ট ব্যাখ্যা রয়েছে localStorage
। তবে মক ফাংশনগুলি কোনও localStorage
পদ্ধতি প্রয়োগ করতে ব্যর্থ হয়েছিল ।
নীচে আমার প্রতিক্রিয়া উপাদানটির বিস্তারিত উদাহরণ যা ডেটা লেখার এবং পড়ার জন্য বিমূর্ত পদ্ধতি ব্যবহার করে,
//file: storage.js
const key = 'ABC';
export function readFromStore (){
return JSON.parse(localStorage.getItem(key));
}
export function saveToStore (value) {
localStorage.setItem(key, JSON.stringify(value));
}
export default { readFromStore, saveToStore };
ত্রুটি:
TypeError: _setupLocalStorage2.default.setItem is not a function
স্থির করুন:
উপহাসের জন্য মক ফাংশন নীচে যুক্ত করুন (পথ .jest/mocks/setUpStore.js
:)
let mockStorage = {};
module.exports = window.localStorage = {
setItem: (key, val) => Object.assign(mockStorage, {[key]: val}),
getItem: (key) => mockStorage[key],
clear: () => mockStorage = {}
};
টাইপসক্রিপ্ট সহ একটি প্রকল্পের জন্য এটি সমাধান করতে এখানে কিছু অন্যান্য উত্তর রিফিড বন্ধ করুন। আমি এটির মতো লোকালস্টোরেশনমক তৈরি করেছি:
export class LocalStorageMock {
private store = {}
clear() {
this.store = {}
}
getItem(key: string) {
return this.store[key] || null
}
setItem(key: string, value: string) {
this.store[key] = value
}
removeItem(key: string) {
delete this.store[key]
}
}
তারপরে আমি একটি লোকালস্টোরেজ র্যাপার ক্লাস তৈরি করেছি যা আমি সরাসরি বিশ্বব্যাপী স্থানীয় স্টোরেজ ভেরিয়েবল অ্যাক্সেস না করে অ্যাপ্লিকেশনটিতে স্থানীয় স্টোরেজে সমস্ত অ্যাক্সেসের জন্য ব্যবহার করি। পরীক্ষার জন্য মোড়কে মক সেট করা সহজ করে তোলে।
describe('getToken', () => {
const Auth = new AuthService();
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ik1yIEpvc2VwaCIsImlkIjoiNWQwYjk1Mzg2NTVhOTQ0ZjA0NjE5ZTA5IiwiZW1haWwiOiJ0cmV2X2pvc0Bob3RtYWlsLmNvbSIsInByb2ZpbGVVc2VybmFtZSI6Ii9tcmpvc2VwaCIsInByb2ZpbGVJbWFnZSI6Ii9Eb3Nlbi10LUdpci1sb29rLWN1dGUtbnVrZWNhdDMxNnMtMzExNzAwNDYtMTI4MC04MDAuanBnIiwiaWF0IjoxNTYyMzE4NDA0LCJleHAiOjE1OTM4NzYwMDR9.YwU15SqHMh1nO51eSa0YsOK-YLlaCx6ijceOKhZfQZc';
beforeEach(() => {
global.localStorage = jest.fn().mockImplementation(() => {
return {
getItem: jest.fn().mockReturnValue(token)
}
});
});
it('should get the token from localStorage', () => {
const result = Auth.getToken();
expect(result).toEqual(token);
});
});
একটি মক তৈরি করুন এবং এটি global
অবজেক্টে যুক্ত করুন
এই স্নিপেটগুলি দিয়ে আপনার স্থানীয় স্টোরেজকে উপহাস করতে হবে
// লোকালস্টোরেজ.জেএস
var localStorageMock = (function() {
var store = {};
return {
getItem: function(key) {
return store[key] || null;
},
setItem: function(key, value) {
store[key] = value.toString();
},
clear: function() {
store = {};
}
};
})();
Object.defineProperty(window, 'localStorage', {
value: localStorageMock
});
এবং ঠাট্টা কনফিগারেশনে:
"setupFiles":["localStorage.js"]
কিছু জিজ্ঞাসা করুন নির্দ্বিধায়।
নিম্নলিখিত সমাধানটি কঠোর প্রকারের স্ক্রিপ্ট, ESLint, TSLint, এবং প্রিটিয়ার কনফিগারেশনের সাথে পরীক্ষার জন্য উপযুক্ত { "proseWrap": "always", "semi": false, "singleQuote": true, "trailingComma": "es5" }
:
class LocalStorageMock {
public store: {
[key: string]: string
}
constructor() {
this.store = {}
}
public clear() {
this.store = {}
}
public getItem(key: string) {
return this.store[key] || undefined
}
public setItem(key: string, value: string) {
this.store[key] = value.toString()
}
public removeItem(key: string) {
delete this.store[key]
}
}
/* tslint:disable-next-line:no-any */
;(global as any).localStorage = new LocalStorageMock()
কীভাবে গ্লোবাল.লোকালস্টোরেজ আপডেট করবেন তার জন্য HT / https://stackoverflow.com/a/51583401/101290
টাইপস্ক্রিপ্টে একই কাজ করতে, নিম্নলিখিতগুলি করুন:
নিম্নলিখিত বিষয়বস্তু সহ একটি ফাইল সেটআপ করুন:
let localStorageMock = (function() {
let store = new Map()
return {
getItem(key: string):string {
return store.get(key);
},
setItem: function(key: string, value: string) {
store.set(key, value);
},
clear: function() {
store = new Map();
},
removeItem: function(key: string) {
store.delete(key)
}
};
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });
তারপরে আপনি আপনার জেস্ট কনফিগারেশনের অধীনে আপনার প্যাকেজ.জসনে নিম্নলিখিত লাইনটি যুক্ত করুন
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
অথবা আপনি যেখানে স্থানীয় স্টোরেজকে উপহাস করতে চান সেই পরীক্ষার ক্ষেত্রে আপনি এই ফাইলটি আমদানি করুন।
value + ''
নাল এবং