আমি চাই একটি ব্যঙ্গ নির্ভরতা বাস্তবায়ন পরিবর্তন প্রতি একটি উপর একক পরীক্ষা ভিত্তিতে দ্বারা ডিফল্ট উপহাস ব্যাপ্ত এর আচরণ এবং এটি ফিরিয়ে প্রত্যাবর্তন মূল বাস্তবায়ন যখন পরবর্তী পরীক্ষা, executes করতে।
আরও সংক্ষেপে আমি এটি অর্জন করার চেষ্টা করছি:
- মোক নির্ভরতা
- একক পরীক্ষায় মক প্রয়োগ পরিবর্তন / প্রসারিত করুন
- যখন পরের পরীক্ষাটি কার্যকর হয় তখন মূল উপহাসে ফিরে আসুন
আমি বর্তমানে ব্যবহার করছি Jest v21
।
এখানে একটি জাস্টিক টেস্ট দেখতে কেমন হবে তা এখানে:
__mocks__/myModule.js
const myMockedModule = jest.genMockFromModule('../myModule');
myMockedModule.a = jest.fn(() => true);
myMockedModule.b = jest.fn(() => true);
export default myMockedModule;
__tests__/myTest.js
import myMockedModule from '../myModule';
// Mock myModule
jest.mock('../myModule');
beforeEach(() => {
jest.clearAllMocks();
});
describe('MyTest', () => {
it('should test with default mock', () => {
myMockedModule.a(); // === true
myMockedModule.b(); // === true
});
it('should override myMockedModule.b mock result (and leave the other methods untouched)', () => {
// Extend change mock
myMockedModule.a(); // === true
myMockedModule.b(); // === 'overridden'
// Restore mock to original implementation with no side effects
});
it('should revert back to default myMockedModule mock', () => {
myMockedModule.a(); // === true
myMockedModule.b(); // === true
});
});
আমি এ পর্যন্ত চেষ্টা করেছি এখানে:
1 - mockFn.mockImplementationOnce (fn)
ভাল
- প্রথম কলের পরে মূল বাস্তবায়নে ফিরে আসে
কনস
- পরীক্ষাটি
b
একাধিকবার কল করলে এটি ভেঙে যায় b
ডাকা না হওয়া পর্যন্ত এটি মূল প্রয়োগে ফিরে যাবে না (পরের পরীক্ষায় ফাঁস হওয়া )
কোড:
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
myMockedModule.b.mockImplementationOnce(() => 'overridden');
myModule.a(); // === true
myModule.b(); // === 'overridden'
});
2 - jest.doMock (মডিউল নাম, কারখানা, বিকল্পসমূহ)
ভাল
- স্পষ্টভাবে প্রতিটি পরীক্ষায় পুনরায় বিদ্রূপ করা
কনস
- সমস্ত পরীক্ষার জন্য ডিফল্ট মক বাস্তবায়ন সংজ্ঞায়িত করা যায় না
- প্রতিটি উপহাস পদ্ধতি পুনরায় ঘোষণা করতে বাধ্য করার জন্য ডিফল্ট বাস্তবায়ন বাড়ানো যায় না
কোড:
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
jest.doMock('../myModule', () => {
return {
a: jest.fn(() => true,
b: jest.fn(() => 'overridden',
}
});
myModule.a(); // === true
myModule.b(); // === 'overridden'
});
3 - সেটার পদ্ধতিগুলির সাথে ম্যানুয়াল উপহাস করা ( এখানে বর্ণিত হিসাবে )
ভাল
- উপহাসের ফলাফলের উপরে সম্পূর্ণ নিয়ন্ত্রণ
কনস
- প্রচুর বয়লারপ্লেট কোড
- দীর্ঘমেয়াদে রক্ষণাবেক্ষণ করা শক্ত
কোড:
__mocks__/myModule.js
const myMockedModule = jest.genMockFromModule('../myModule');
let a = true;
let b = true;
myMockedModule.a = jest.fn(() => a);
myMockedModule.b = jest.fn(() => b);
myMockedModule.__setA = (value) => { a = value };
myMockedModule.__setB = (value) => { b = value };
myMockedModule.__reset = () => {
a = true;
b = true;
};
export default myMockedModule;
__tests__/myTest.js
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
myModule.__setB('overridden');
myModule.a(); // === true
myModule.b(); // === 'overridden'
myModule.__reset();
});
4 - jest.spyOn (বস্তু, পদ্ধতি নাম)
কনস
- আমি
mockImplementation
আসল উপহাস করা রিটার্ন মানটিতে ফিরে যেতে পারি না , তাই পরবর্তী পরীক্ষাগুলি প্রভাবিত করে
কোড:
beforeEach(() => {
jest.clearAllMocks();
jest.restoreAllMocks();
});
// Mock myModule
jest.mock('../myModule');
it('should override myModule.b mock result (and leave the other methods untouched)', () => {
const spy = jest.spyOn(myMockedModule, 'b').mockImplementation(() => 'overridden');
myMockedModule.a(); // === true
myMockedModule.b(); // === 'overridden'
// How to get back to original mocked value?
});