Jest: यूनिट परीक्षणों के अंदर कंसोल को अक्षम करने का बेहतर तरीका


103

मुझे आश्चर्य है कि अगर एक विशिष्ट जेस्ट परीक्षण के अंदर कंसोल त्रुटियों को अक्षम करने का एक बेहतर तरीका है (यानी, प्रत्येक परीक्षण से पहले / बाद में मूल कंसोल को पुनर्स्थापित करें )।

यहाँ मेरा वर्तमान तरीका है:

describe("Some description", () => {
  let consoleSpy;

  beforeEach(() => {
    if (typeof consoleSpy === "function") {
      consoleSpy.mockRestore();
    }
  });

  test("Some test that should not output errors to jest console", () => {
    expect.assertions(2);

    consoleSpy = jest.spyOn(console, "error").mockImplementation();

    // some function that uses console error
    expect(someFunction).toBe("X");
    expect(consoleSpy).toHaveBeenCalled();
  });

  test("Test that has console available", () => {
    // shows up during jest watch test, just as intended
    console.error("test");
  });
});

क्या एक ही काम पूरा करने का एक क्लीनर तरीका है? मैं बचना चाहूंगा spyOn, लेकिन mockRestoreकेवल इसके साथ काम करना प्रतीत होता है

धन्यवाद!

जवाबों:


136

विशेष रूप से विशेष फ़ाइल के लिए, एंड्रियास काफी अच्छा है। नीचे सेटअप console.logसभी परीक्षण सूट के लिए बयानों को दबा देगा ,

jest --silent

(या)

अनुकूलित करने के लिए warn, info and debugआप नीचे सेटअप का उपयोग कर सकते हैं

__tests __ / setup.js या jest-preload.js कॉन्फ़िगर किया गया हैsetupFilesAfterEnv

global.console = {
  log: jest.fn(), // console.log are ignored in tests

  // Keep native behaviour for other methods, use those to print out things in your own tests, not `console.log`
  error: console.error,
  warn: console.warn,
  info: console.info,
  debug: console.debug,
};

jest.config.js

module.exports = {
    verbose: true,
    setupTestFrameworkScriptFile: "<rootDir>/__tests__/setup.js",
};

Jest v24.x नोट: setupTestFrameworkScriptFile सेटअप के पक्ष में हटा दिया गया है।

module.exports = {
    verbose: true,
    setupFilesAfterEnv: ["<rootDir>/__tests__/setup.js"],
};

2
नमस्ते! setupTestFrameworkScriptFileके पक्ष में पदावनत किया जाता है setupFilesAfterEnv
एलोहिनिन

1
मॉकिंग global.consoleवास्तव में जाने का एक सरल तरीका है, और किसी भी कॉन्फ़िगर के माध्यम से किया जा सकता है setupFilesAfterEnv consoleऑब्जेक्ट के सभी मूल तरीकों का मजाक उड़ाने के लिए सावधान रहें या आप अन्य अप्रत्याशित त्रुटियों का सामना कर सकते हैं।
वडकोरक्वेस्ट

53

जैसा कि प्रत्येक परीक्षण फ़ाइल अपने स्वयं के धागे में चलती है, यदि आप इसे एक फ़ाइल में सभी परीक्षण के लिए अक्षम करना चाहते हैं, तो इसे पुनर्स्थापित करने की कोई आवश्यकता नहीं है। उसी कारण से आप भी लिख सकते हैं

console.log = jest.fn()
expect(console.log).toHaveBeenCalled();

1
उस मामले की जानकारी के लिए धन्यवाद। इसका कोई मतलब नहीं है :) मैं इसे फिर से बहाल किए बिना एक विशिष्ट परीक्षण के अंदर ही उस तरह से बनाने का एक तरीका ढूंढ रहा था (मुझे शुरू में लगा कि यह डिफ़ॉल्ट रूप से व्यवहार था), लेकिन मुझे लगता है कि इससे पहले कि यह चाल हो।
एपिडक्लाउड

51

यदि आप इसे केवल एक विशिष्ट परीक्षण के लिए करना चाहते हैं:

beforeEach(() => {
  jest.spyOn(console, 'warn').mockImplementation(() => {});
});

1
ये जबरदस्त है!
शेरिफ_पुल

21

मैंने पाया है कि फिर से ऊपर जवाब: दबाने console.logसभी परीक्षण स्वीट भर में फेंक दिया त्रुटियों जब किसी अन्य consoleतरीकों (जैसे warn, error) कहा जाता था, क्योंकि यह पूरे वैश्विक जगह किया गया थाconsole वस्तु।

यह कुछ इसी तरह का दृष्टिकोण मेरे लिए जेस्ट 22+ के साथ काम किया:

package.json

"jest": {
  "setupFiles": [...],
  "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js",
  ...
}

हंसी / setup.js

jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());

इस पद्धति का उपयोग करते हुए, केवल console.logइसका मजाक उड़ाया जाता है और अन्य consoleतरीके अप्रभावित रहते हैं।


7

मेरे लिए अधिक स्पष्ट / स्वच्छ तरीके से (पाठक को यह समझने के लिए कि क्या हो रहा है) jest API की थोड़ी जानकारी की आवश्यकता है, बस मैन्युअल रूप से क्या करना है mockRestore करता है:

// at start of test you want to suppress
const consoleLog = console.log;
console.log = jest.fn();

// at end of test
console.log = consoleLog;

1
आपको
कंसोल.info

1
@ माइकल-अल्कोहल आपको कंसोल को पुनः आरंभ करने की आवश्यकता क्यों है। मुझे लगता है कि हर वर्णन के बाद
मोक्स

2
@ झोनटैन मुझे नहीं लगता कि यह हर विवरण के बाद स्पष्ट होता है, हालांकि मैंने हाल ही में यह सुनिश्चित करने के लिए परीक्षण नहीं किया है। जेस्ट डॉक्स के अनुसार एक clearMocksऔर resetMocksकॉन्फ़िगरेशन विकल्प है, लेकिन वे दोनों डिफ़ॉल्ट हैं false, और उनमें से कोई भी वास्तव में प्रारंभिक कार्यान्वयन को पुनर्स्थापित नहीं करता है, भले ही वह सेट हो true। और, यह देखते हुए कि यह एक विन्यास विकल्प है जिसे किसी बिंदु पर बदला जा सकता है, मुझे लगता है कि यह सुनिश्चित करने के लिए मैन्युअल रूप से सफाई करना सबसे अच्छा अभ्यास है कि आपके परीक्षणों को भविष्य में समस्या नहीं होगी।
माइकल लिकोरी

0

एक और दृष्टिकोण का उपयोग करना है process.env.NODE_ENVइस तरह से कोई व्यक्ति चुनिंदा तरीके से परीक्षण चलाने के दौरान क्या दिखा सकता है (या नहीं):

if (process.env.NODE_ENV === 'development') {
  console.log('Show output only while in "development" mode');
} else if (process.env.NODE_ENV === 'test') {
  console.log('Show output only while in "test" mode');
}

या

const logDev = msg => {
  if (process.env.NODE_ENV === 'development') {
    console.log(msg);
  }
}
logDev('Show output only while in "development" mode');

इसके लिए इस कॉन्फ़िगरेशन को रखना होगा package.json:

"jest": {
  "globals": {
    "NODE_ENV": "test"
  }
}

ध्यान दें कि यह दृष्टिकोण मूल प्रश्न का सीधा समाधान नहीं है, लेकिन जब तक किसी को निर्दिष्ट console.logस्थिति के साथ लपेटने की संभावना है, तब तक अपेक्षित परिणाम देता है ।


1
प्रश्न का लेखक परीक्षण पर कंसोल.लॉग को अक्षम कैसे करता है। यह समाधान इष्टतम नहीं है।
एरिक

वहाँ बाहर कॉपी-pasters के लिए: की जगह ===के साथ !==अपनी आवश्यकताओं के अनुसार। मैं वर्षों से इस दृष्टिकोण का उपयोग कर रहा हूं और यह त्रुटिपूर्ण रूप से काम करता है, लेकिन मैं अपनी आवश्यकताओं के अनुसार समायोजन करता हूं।
वालेस सिधारे

वास्तविक सवाल का जवाब नहीं है।
माइकल ओरील

यह एक हैकी समाधान है और अनुकूलन योग्य नहीं है। क्या होगा यदि केवल एक विशिष्ट परीक्षण के लिए अक्षम हो और दूसरे को नहीं?
झोटानन जू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.