प्रत्येक परीक्षण से पहले जेस्ट मॉक फ़ंक्शंस कॉल को कैसे रीसेट करें


87

मैं जेस्ट में नया हूं, मैं परीक्षण के लिए इसका उपयोग करने की कोशिश कर रहा हूं कि क्या एक फ़ंक्शन को बुलाया गया था या नहीं। मैंने देखा कि mock.calls.length हर टेस्ट के लिए रीसेट नहीं हो रहा है, लेकिन जमा हो रहा है। मैं हर परीक्षण से पहले इसे 0 कैसे बना सकता हूं? मैं नहीं चाहता कि मेरा अगला परीक्षण पिछले परिणामों पर निर्भर हो।

मुझे पता है कि जेस्ट में पहले भी कोई है - क्या मुझे इसका उपयोग करना चाहिए? Mock.calls.length को रीसेट करने का सबसे अच्छा तरीका क्या है? धन्यवाद।

एक कोड उदाहरण:

योग:

import local from 'api/local';

export default {
  addNumbers(a, b) {
    if (a + b <= 10) {
      local.getData();
    }
    return a + b;
  },
};

Sum.test.js

import sum from 'api/sum';
import local from 'api/local';
jest.mock('api/local');

// For current implementation, there is a difference 
// if I put test 1 before test 2. I want it to be no difference

// test 1
test('should not to call local if sum is more than 10', () => {
  expect(sum.addNumbers(5, 10)).toBe(15);
  expect(local.getData.mock.calls.length).toBe(0);
});

// test 2
test('should call local if sum <= 10', () => {
  expect(sum.addNumbers(1, 4)).toBe(5);
  expect(local.getData.mock.calls.length).toBe(1);
});

जवाबों:


141

एक तरह से मुझे इसे संभालने के लिए मिला: प्रत्येक परीक्षण के बाद नकली फ़ंक्शन को साफ़ करने के लिए:

Sum.test.js में जोड़ने के लिए:

afterEach(() => {
  local.getData.mockClear();
});

यदि आप प्रत्येक परीक्षण के बाद सभी नकली कार्यों को साफ़ करना चाहते हैं, तो clearAllMocks का उपयोग करें

afterEach(() => {
  jest.clearAllMocks();
});

उत्सुक अगर वहाँ एक तरीका है यह सब नकली वस्तु के तरीकों के लिए है। जब मैं कोशिश local.mockClear()करता हूं तो यह काम नहीं करता है।
नागरिक कॉन

27
क्या आपने उपयोग करने की कोशिश की है jest.clearAllMocks()? डॉक्स: jestjs.io/docs/en/jest-object#jestclearallmocks
एलेक्स

@AlexEfremov, jest.clearAllMocks()समारोह के लिए बहुत बहुत धन्यवाद ! मैं कक्षाओं के mockClear()लिए उपयोग कर रहा हूं jest.mockऔर जाहिर तौर पर नकली किसी भी तरह से पूरी तरह से साफ नहीं किया गया था (नकली कक्षाओं के अंदर जासूसी फ़ंक्शन कॉल को मंजूरी नहीं दी गई थी)। यह वास्तव में कष्टप्रद वस्तु उदाहरण अंतर त्रुटियों में हुई Compared values have no visual difference.:।
पैट्रिक

इस उत्तर को बढ़ाने के लिए, मैंने अपनी jest.config.jsसंपत्ति को अपडेट किया resetMocks: true
केविन ऑंग

22

जैसा कि @AlexEfremov ने टिप्पणियों में बताया। आप clearAllMocksप्रत्येक परीक्षण के बाद उपयोग करना चाहते हैं :

afterEach(() => {
    jest.clearAllMocks();
});

ध्यान रखें इससे आपके पास होने वाले हर मॉक फंक्शन की कॉल काउंट क्लियर हो जाएगी, लेकिन शायद यही सही तरीका है।


8

आप प्रत्येक परीक्षण के बाद मक्स को रीसेट करने के लिए जेस्ट को कॉन्फ़िगर कर सकते हैं jest.config.js:

module.exports = {
  resetMocks: true,
};

यहाँ इस विन्यास पैरामीटर के लिए प्रलेखन है: https://jestjs.io/docs/en/configuration#resetmocks-oolean

रीसेट करें [बूलियन]

डिफ़ॉल्ट: गलत

प्रत्येक परीक्षण से पहले नकली स्थिति को स्वचालित रूप से रीसेट करें। प्रत्येक परीक्षण से पहले jest.resetAllMocks () को कॉल करने के लिए बराबर। इससे कोई भी नकली उनके नकली कार्यान्वयन को हटा देगा, लेकिन उनके प्रारंभिक कार्यान्वयन को पुनर्स्थापित नहीं करता है।


3
धन्यवाद! यह डिफ़ॉल्ट सेटिंग वास्तव में मुझे भ्रमित क्यों नहीं करती है ...
बेतरतीब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.