Обнаружение вызовов console.log () - PullRequest
7 голосов
/ 30 августа 2011

Я пытаюсь написать контрольный пример для метода отладки, который записывает сообщения в консоль JavaScript с помощью console.log().Тест должен проверить, что сообщение было успешно записано на консоль.Я использую jQuery.

Есть ли способ присоединить хук к console.log() или иным образом проверить, было ли записано сообщение на консоль, или есть другие предложения о том, как написать тестовый пример?1005 *

Ответы [ 4 ]

17 голосов
/ 30 августа 2011

console.log не хранит записи сообщений, которые регистрируются, или генерируют события, которые вы можете прослушать.Ваши тесты не могут напрямую проверить свой вывод из JavaScript.Вместо этого ваш тестовый код должен будет заменить console.log реализацией mock , которая отслеживает сообщения журнала для последующей проверки.

Mocking - это общая функция, поддерживаемая большинством тестовых сред JavaScript,Например, инфраструктура тестирования Jest предоставляет jest.spyOn функцию , которая заменяет данный метод фиктивной реализацией, которая записывает аргументы для каждого вызова в свойстве .mock перед их передачей.на оригинальной реализации.После каждого теста вы можете вызвать jest.clearAllMocks(), чтобы сбросить списки записанных аргументов для следующего теста, или использовать эквивалентную clearMocks: true опцию конфигурации .

function saySomething() {
  console.log("Hello World");
}
jest.spyOn(console, 'log');

test("saySomething says hello", () => {
  expect(console.log.mock.calls.length).toBe(0);
  saySomething();
  expect(console.log.mock.calls.length).toBe(1);
  expect(console.log.mock.calls[0][0]).toBe("Hello World");
});

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

Если вы не используете тестовый фреймворк (вам, вероятно, следует), вы можете сами создать простой макет.

function saySomething() {
  console.log("Hello World");
}
function testSomething() {
  // Replace console.log with stub implementation.
  const originalLog = console.log;
  const calls = [];
  console.log = (...args) => {
    calls.push(args);
    originalLog(...args);
  };

  try {
    console.assert(calls.length == 0);
    saySomething();
    console.assert(calls.length == 1);
    console.assert(calls[0][0] == "Hello World");
  } catch (error) {
    console.error(error);
  } finally {
    // Restore original implementation after testing.
    console.log = originalLog;
  }
}
9 голосов
/ 18 сентября 2011

Так что неплохие решения, но если вам нужен высокопроизводительный регистратор, попробуйте Paul Irish log ()

Если это слишком высокая мощность, вы можете обойтись чем-то вроде этого.

var console = window.console,
    _log = console ? console.log : function(){};

_log.history = [];

console.log = function( ){
  _log.history.push.apply( _log.history, arguments );
  _log.apply( console, arguments );
}

Использование

console.log('I','have','an','important','message');
//Use native one instead
_log.call( console, _log.history );

http://jsfiddle.net/BeXdM/

8 голосов
/ 03 ноября 2015

Если вы используете Жасмин, это очень просто:

it('is my test', function () {
    spyOn(console, 'log');
    // do your stuff that should log something
    expect(console.log).toHaveBeenCalledWith('something');
});

Отправляйтесь на Жасмин документы для получения дополнительной информации.

5 голосов
/ 30 августа 2011

Просто прикрепите свою собственную функцию к console.log. На вашей странице после того, как все загрузится,

Перед началом испытаний -


var originalLog = console.log;
console.log = function(msg){
  alert('my .log hook received message - '+msg); 
  //add your logic here
}

После запуска тестов, при необходимости -

console.log = originalLog
...