ঠাট্টা: ইউনিট পরীক্ষার অভ্যন্তরে কনসোলকে অক্ষম করার আরও ভাল উপায়


91

আমি ভাবছি যদি সেখানে একটি ভাল উপায় নেই নিষ্ক্রিয় কনসোল ত্রুটি ভিতরে একটি নির্দিষ্ট ঠাট্টা পরীক্ষা (অর্থাত, মূল কনসোল পুনরুদ্ধার / আগে প্রতিটি পরীক্ষা পর)।

এখানে আমার বর্তমান পদ্ধতি:

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কেবল এটির সাথেই কাজ করবে বলে মনে হচ্ছে

ধন্যবাদ!

উত্তর:


125

নির্দিষ্ট স্পেক ফাইলের জন্য, আন্দ্রেয়াস যথেষ্ট ভাল। নীচে সেটআপ 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",
};

জেস্ট ভি 24.x দ্রষ্টব্য: সেটআপটেষ্টফ্রেমওয়ার্কসক্রিপ্টফিল সেটআপফাইসএফটারএএনভিভিয়ের পক্ষে অবহিত করা হয়েছে।

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

4
ওহে! setupTestFrameworkScriptFileপক্ষে হ্রাস করা হয় setupFilesAfterEnv
elhoucine

4
বিদ্রূপ global.consoleকরা সত্যই সহজ উপায়, এবং যে কোনও কনফিগার করা মাধ্যমে করা যায় setupFilesAfterEnv consoleঅবজেক্টের সমস্ত দেশীয় পদ্ধতি উপহাস করার বিষয়ে সাবধান বা অন্য অপ্রত্যাশিত ত্রুটির মুখোমুখি হতে পারেন।
ভাদোরকোয়েস্ট

49

প্রতিটি পরীক্ষার ফাইলটি তার নিজস্ব থ্রেডে চালিত হওয়ার সাথে সাথে যদি আপনি একটি ফাইলের সমস্ত পরীক্ষার জন্য এটি অক্ষম করতে চান তবে এটি পুনরুদ্ধার করার দরকার নেই। একই কারণে আপনি কেবল লিখতে পারেন

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

4
এই বিষয়ে তথ্যের জন্য আপনাকে ধন্যবাদ। এটির কোনও অর্থ নেই :) আমি এটি পুনরুদ্ধার না করে কেবলমাত্র একটি নির্দিষ্ট পরীক্ষার অভ্যন্তরে সেভাবে তৈরি করার জন্য একটি উপায় খুঁজছিলাম (আমি প্রাথমিকভাবে ভেবেছিলাম যে এটি পূর্বনির্ধারিতভাবে আচরণ ছিল) তবে আমি অনুমান করি প্রত্যেকটি কৌশলটি আগেই করে।
এপিডক্লাউড


20

আমি দেখতে পেয়েছি যে উপরের উত্তরটি পুনরায়: console.logসমস্ত পরীক্ষার স্যুট জুড়ে দমন করার সময় ত্রুটি ছুঁড়েছে যখন অন্য কোনও consoleপদ্ধতি (যেমন warn, error) বলা হয়েছিল কারণ এটি পুরো বিশ্বব্যাপী consoleঅবজেক্টটি প্রতিস্থাপন করছে ।

এই কিছুটা অনুরূপ পদ্ধতি আমার জন্য জাস্ট 22+ এর সাথে কাজ করেছে:

package.json

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

jest / setup.js

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

এই পদ্ধতিটি ব্যবহার করে, কেবল console.logউপহাস করা হয় এবং অন্যান্য consoleপদ্ধতিগুলি প্রভাবিত হয় না।


6

আমার কাছে আরও পরিষ্কার / পরিষ্কার উপায় (পাঠককে যা ঘটছে তা বুঝতে জাস্টি এপিআই সম্পর্কে অল্প জ্ঞানের প্রয়োজন আছে), মক-রেস্টোর যা করেন তা হ'ল ম্যানুয়ালি করা:

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

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


4
@ মাইকেল-লিকুইরি কেন আপনার কনসোল.লগ পুনরায় চালু করতে হবে? আমি মনে করি প্রতিটি বর্ণনার পরে
বিদ্রূপগুলি

4
@ জোনাটান আমি মনে করি না যে প্রতিটি বর্ণনার পরে এটি পরিষ্কার হয়ে যায়, যদিও আমি সম্প্রতি এটি পরীক্ষা করে দেখিনি। মতে বিদ্রূপের বিষয় রূপে গ্রহণ ডক্স একটি আছে clearMocksএবং resetMocksকনফিগারেশন অপশন কিন্তু তারা উভয় ডিফল্টে false, এবং তন্ন তন্ন যারা আসলে এমনকি যদি সেটে প্রাথমিক বাস্তবায়ন পুনঃস্থাপন true। এবং এটি একটি কনফিগার বিকল্প হিসাবে বিবেচনা করে যে কোনও সময়ে পরিবর্তিত হতে পারে, আমি মনে করি আপনার পরীক্ষাগুলি ভবিষ্যতে সমস্যা সৃষ্টি করবে না তা নিশ্চিত করার জন্য ম্যানুয়ালি পরিষ্কার করা ভাল অনুশীলন।
মাইকেল লিকুরি

-1

আরেকটি পন্থা ব্যবহার করা হয় 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না কারও কাছে উল্লিখিত শর্তটি মোড়ানোর সম্ভাবনা থাকে ততক্ষণ প্রত্যাশিত ফলাফল দেয় ।


4
প্রশ্নের লেখক কী তা হচ্ছে পরীক্ষায় কনসোল.লগ কীভাবে অক্ষম করবেন। এই সমাধানটি অনুকূল নয়।
এরিক 16

সেখানে আউট কপি-pasters জন্য: প্রতিস্থাপন ===সঙ্গে !==আপনার চাহিদা অনুযায়ী। আমি বছরের পর বছর ধরে এই পদ্ধতির ব্যবহার করে আসছি এবং এটি নির্দ্বিধায় কাজ করে, তবে আমি আমার চাহিদা অনুযায়ী সামঞ্জস্য করি।
ওয়ালেস সিদ্ধ্রি

আসল প্রশ্নের উত্তর দেয় না।
মাইকেল অরিল

এটি হ্যাকি সমাধান এবং কাস্টমাইজযোগ্য নয়। যদি কেবলমাত্র একটি নির্দিষ্ট পরীক্ষার জন্য অক্ষম হয় এবং অন্যটি না হয়?
ঝোনাটান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.