Jest: Cách tốt hơn để tắt bảng điều khiển bên trong các bài kiểm tra đơn vị


91

Tôi tự hỏi liệu có cách nào tốt hơn để vô hiệu hóa lỗi bảng điều khiển bên trong một bài kiểm tra Jest cụ thể (tức là, khôi phục bảng điều khiển ban đầu trước / sau mỗi lần kiểm tra) hay không.

Đây là cách tiếp cận hiện tại của tôi:

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");
  });
});

Có cách nào tốt hơn để hoàn thành điều tương tự không? Tôi muốn tránh spyOn, nhưng mockRestoredường như chỉ làm việc với nó .

Cảm ơn!

Câu trả lời:


126

Đối với tệp thông số kỹ thuật cụ thể, của Andreas là đủ tốt. Thiết lập bên dưới sẽ loại bỏ các console.logcâu lệnh cho tất cả các bộ thử nghiệm,

jest --silent

(hoặc là)

Để tùy chỉnh, warn, info and debugbạn có thể sử dụng thiết lập bên dưới

__tests __ / setup.js hoặc jest-preload.js được định cấu hình trongsetupFilesAfterEnv

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 Lưu ý: setupTestFrameworkScriptFile không được dùng nữa thay vì setupFilesAfterEnv.

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

2
Chào! setupTestFrameworkScriptFilekhông được ủng hộ setupFilesAfterEnv.
elhoucine

1
Chế giễu global.consolethực sự là một cách đơn giản để thực hiện và có thể được thực hiện thông qua bất kỳ cấu hình nào setupFilesAfterEnv . Hãy cẩn thận để bắt chước tất cả các phương thức gốc của consoleđối tượng hoặc bạn có thể gặp phải các lỗi không mong muốn khác.
Vadorequest

49

Vì mọi tệp kiểm tra chạy trong chuỗi riêng của nó nên không cần khôi phục nếu bạn muốn vô hiệu hóa nó cho tất cả kiểm tra trong một tệp. Vì lý do tương tự, bạn cũng có thể viết

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

1
Cảm ơn bạn đã thông tin về vấn đề đó. Nó có ý nghĩa :) Tôi đã tìm cách để làm cho nó theo cách đó chỉ trong một bài kiểm tra cụ thể mà không cần phải khôi phục nó (ban đầu tôi nghĩ đó là hành vi theo mặc định), nhưng tôi đoán trước đây mỗi người đều làm được.
Apidcloud

46

Nếu bạn chỉ muốn làm điều đó cho một bài kiểm tra cụ thể:

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

1
điều này là tuyệt vời!
sheriff_paul

20

Tôi phát hiện ra rằng câu trả lời ở trên lại: đàn áp console.logtrên tất cả các dãy phòng thử nghiệm ném lỗi khi bất kỳ khác consolephương pháp (ví dụ warn, error) được gọi là vì nó đã được thay thế toàn bộ toàn cầu consoleđối tượng.

Cách tiếp cận hơi tương tự này đã làm việc cho tôi với Jest 22+:

package.json

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

jest / setup.js

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

Sử dụng phương pháp này, chỉ console.logbị chế nhạo và các consolephương pháp khác không bị ảnh hưởng.


7

Đối với tôi, một cách rõ ràng / rõ ràng hơn (người đọc cần ít kiến ​​thức về API jest để hiểu điều gì đang xảy ra), là chỉ làm thủ công những gì mockRestore làm:

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

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

1
Bạn cũng cần phải che console.info, console.error, console.warn vv
Michael Oryl

1
@ michael-wineori tại sao bạn cần khởi động lại console.log? Tôi nghĩ rằng sau khi mọi mô tả, những lời chế giễu được xóa sạch
Jhonatan

2
@Jhonatan Tôi không nghĩ nó rõ ràng sau mỗi mô tả, mặc dù tôi đã không kiểm tra điều này gần đây để chắc chắn. Theo tài liệu jest có một clearMocksresetMockscấu hình tùy chọn nhưng cả hai đều mặc định false, không ai trong số những người thực sự khôi phục việc thực hiện ban đầu ngay cả khi thiết lập để true. Và, coi đây là một tùy chọn cấu hình có thể được thay đổi tại một số thời điểm, tôi nghĩ cách tốt nhất là dọn dẹp theo cách thủ công để đảm bảo các thử nghiệm của bạn sẽ không gây ra sự cố trong tương lai.
Michael Liquori

-1

Một cách tiếp cận khác là sử dụng process.env.NODE_ENV. Bằng cách này, người ta có thể chọn những gì sẽ hiển thị (hoặc không) trong khi chạy thử nghiệm:

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');
}

hoặc là

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

Điều này sẽ yêu cầu cấu hình này được đặt trên package.json:

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

Lưu ý rằng cách tiếp cận này không phải là giải pháp trực tiếp cho câu hỏi ban đầu, nhưng mang lại kết quả mong đợi miễn là người ta có khả năng kết hợp câu hỏi console.logvới điều kiện đã đề cập.


1
Tác giả của câu hỏi là làm thế nào để vô hiệu hóa console.log khi thử nghiệm. Giải pháp này không phải là tối ưu.
Erick

Đối với copy-pasters ngoài kia: thay thế ===bằng !==tùy theo nhu cầu của bạn. Tôi đã sử dụng phương pháp này trong nhiều năm và nó hoạt động hoàn hảo, nhưng tôi thực hiện các điều chỉnh theo nhu cầu của mình.
Wallace Sidhrée

Không trả lời câu hỏi thực tế.
Michael Oryl

Đây là một giải pháp hacky và không thể tùy chỉnh. Điều gì sẽ xảy ra nếu vô hiệu hóa chỉ cho một thử nghiệm cụ thể chứ không phải thử nghiệm khác?
Jhonatan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.