it-roy-ru.com

Jest: лучший способ отключить консоль внутри юнит-тестов

Интересно, есть ли лучший способ отключить ошибки консоли внутри a специфичный Jest тест (то есть, восстановить исходную консоль до/после каждого теста).

Вот мой текущий подход:

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, похоже, работает только с ним .

Спасибо!

16
Apidcloud

Поскольку каждый тестовый файл выполняется в своем собственном потоке, нет необходимости восстанавливать его, если вы хотите отключить его для всех тестов в одном файле. По той же причине вы можете просто написать 

console.log = jest.fn()
expect(console.log).toHaveBeenCalled();
23
Andreas Köberle

Для конкретного спецификационного файла Андреаса достаточно. Ниже настройки будут подавлять операторы console.log для всех наборов тестов, 

jest --silent

(или же)

Для настройки warn, info and debug вы можете использовать настройки ниже

__tests __/setup.js

global.console = {
    log: jest.fn()
}

jest.config.js

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

Я обнаружил, что ответ выше: подавление console.log во всех тестовых наборах приводило к ошибкам при вызове любых других методов console (например, warn, error), поскольку он заменял весь глобальный объект console.

Этот несколько похожий подход работал для меня с Jest 22+:

package.json

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

jEST/setup.js

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

При использовании этого метода проверяется только console.log, а другие методы console не затрагиваются.

11
nickb

Другой подход заключается в использовании 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 указанным условием.

0
Wallace Sidhrée