मैं प्रति परीक्षण के आधार पर एक नकली निर्भरता के कार्यान्वयन को डिफ़ॉल्ट मॉक के व्यवहार को बढ़ाकर और अगले परीक्षण के पूरा होने पर मूल कार्यान्वयन पर वापस लौटना चाहूंगा।
संक्षेप में यह वही है जिसे मैं प्राप्त करने की कोशिश कर रहा हूं:
- नकली निर्भरता
- परिवर्तन / एकल परीक्षण में मॉक क्रियान्वयन का विस्तार करें
- जब अगला परीक्षण निष्पादित हो, तो मूल मॉक पर वापस लौटें
मैं वर्तमान में उपयोग कर रहा हूं 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?
});